【发布时间】:2015-02-15 23:10:11
【问题描述】:
我想从给定的根目录中递归地查找具有给定扩展名的文件,并显示当前在我的 GUI 中找到的文件数。 由于这种处理可能很长,因此可能会阻塞 GUI。 我可以等待处理结束并获取文件数,但我正在学习 Qt (PyQt),所以我认为这是一种培训。
所以我已经阅读了 Qt 文档: When to Use Alternatives to Threads,我不认为它适合我。
然后我读到: Choosing an Appropriate Approach,我认为我的解决方案是第一个:
在另一个线程中运行一个新的线性函数,可以选择使用 运行期间的进度更新
但在这种情况下,您有 3 个选择:
Qt 提供了不同的解决方案:
- 将该函数置于 QThread::run() 的重新实现中并启动 QThread。发出信号以更新进度。或
- 将该函数置于 QRunnable::run() 的重新实现中,并将 QRunnable 添加到 QThreadPool。写入线程安全变量 更新进度。或
- 使用 QtConcurrent::run() 运行函数。写入线程安全变量以更新进度。
你能告诉我如何选择最好的吗? 我已经阅读了一些“解决方案”,但我想了解为什么您应该使用一种方法而不是另一种方法。
而且由于我正在寻找文件,我可能有一个目录,其中许多文件都与搜索条件匹配。所以这意味着很多中断。对此有什么特别要注意的吗?
谢谢!
【问题讨论】:
-
我只有使用 QThread 的经验,并没有太多经验。但是,据我所知(并基于图表),其他选项无法收到信号。因此,例如,我不确定您将如何处理用户发起的取消。
-
这是一个有趣的观点。我没有注意到有关信号的部分。这很有帮助!同时我查看了
QThread,发现Qt doc在这方面并不完美:mayaposch.wordpress.com/2011/11/01/… -
我应该阅读这篇文章,因为我需要将 QThreads 添加到现有项目中。嗯,他们在那里,但没有充分利用。您需要记住的一条黄金法则是,对小部件的任何操作都必须发生在主线程中,这是信号和插槽发挥作用的地方,因此请考虑到这一点。另请注意,Qt4 的两个版本之间的 QThread 实现存在差异。我认为是 4.7 和 4.8,所以一定要调查一下。
-
事实上,我所说的更改专门使子类化 QThread 过时了......或者至少不需要。因此,请确认您拥有的版本,然后确定该文章是否有效。
-
我使用的是 Qt 5.3,所以我可以遵循指南,即。不要继承
QThread。感谢有关小部件处理的黄金法则。我会记住这一点。顺便说一句,如果您想发布一个解决方案,说明有关通过信号进行通信的内容,我很乐意接受。这就是我正在寻找的答案!谢谢!
标签: multithreading qt