【问题标题】:Simple Qt threading mechanism with progress?有进步的简单Qt线程机制?
【发布时间】: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


【解决方案1】:

据我所知(希望能有更多人加入)。 QThread 提供对信号交互的支持。例如,您可以使用信号停止并发功能。如果有的话,不确定您将如何使用其他选项来做到这一点。

要记住的事情:小部件都必须存在于主线程中,但可以通过信号和插槽与其他线程进行通信。

关于该主题的另一个快速线程/一些不错的项目符号。 https://qt-project.org/forums/viewthread/50165/

祝你的项目好运,欢迎来到 Qt!

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多