QProcess, QEventLoop - 可用于并行处理

Posted

技术标签:

【中文标题】QProcess, QEventLoop - 可用于并行处理【英文标题】:QProcess, QEventLoop - of any use for parallel-processing 【发布时间】:2012-04-22 16:31:50 【问题描述】:

我想知道我是否可以使用 QEventLoop (QProcess?) 来并行化对 Qt 同一函数的多个调用。 QtConcurrent 或 QThread 究竟有什么区别?更准确地说,什么是流程和事件循环?我读到 QCoreApplication 必须在 main() 方法中尽早 exec() ,所以我想知道为什么它与主线程不同。

您能否指出一些关于 Qt 进程和线程的有效参考?我是通过官方文档来的,这些事情仍然不清楚。

感谢和问候。

【问题讨论】:

你能恢复你的函数正在做什么吗? 【参考方案1】:

进程和线程不是 Qt 特定的概念。您可以在任何地方搜索“进程与线程”以解释该区别。例如:What resources are shared between threads?

虽然相关概念,但与在现有进程中生成新线程相比,生成新进程是一种更“重量级”的并行形式。默认情况下,进程是相互保护的,而进程中的执行线程可以直接读取和写入彼此的内存。您从生成进程中获得的保护会带来更大的运行时间成本……而且由于独立进程无法读取彼此的内存,因此您必须使用 inter-process communication 的方法在它们之间共享数据。

您很可能需要线程,因为在一个程序中编写所有代码的情况下,它们更易于使用。考虑到多线程编程的所有复杂性,我建议先看一本好书或阅读一些网站。见:What are some good resources for learning threaded programming?

但是,如果您想深入了解 Qt 中线程的外观,您可以花时间查看示例:

http://qt-project.org/doc/qt-4.8/examples-threadandconcurrent.html

QtConcurrent 是一个抽象库,可以更轻松地实现某些类型的并行编程模式。它建立在 QThread 抽象之上,没有什么可以做的是你不能通过直接写入 QThread 来编写自己的代码。但它可能会使您的代码更容易编写并且不易出错。

至于事件循环......这只是一个通用术语,表示程序中任何给定的执行线程如何等待工作项处理、处理它们,并可以决定何时不再需要它。如果一个线程的工作仅仅是启动,做一些数学运算,然后退出……那么它就不需要事件循环。但是启动和停止线程需要时间并且会搅动资源。所以通常线程的生存时间更长,并且有一个知道如何等待它需要响应的事件的事件循环。

如果您在 QtConcurrent 之上构建,您将不必担心工作线程中的事件循环,因为它们是在线程池中自动管理的。字数统计示例非常简单:

http://qt-project.org/doc/qt-4.8/qtconcurrent-wordcount-main-cpp.html

【讨论】:

感谢有趣的 cmets 和参考。 您是否有提示,为什么使用 QtConcurrent 实现多线程与代码中存在 QTime 对象有一些交互。这似乎发生在我的代码中。在“多线程代码”之前和之后调用 Qtime::start() 和 Qtime::elapsed() 方法,它可以工作;没有,与异步相比,我没有时间改进。实现,以便我发现并行化不起作用。谢谢。 并行化并不总是能提高性能,尤其是在琐碎的任务中。我看到您提出的另一个关于生成 2000 个随机坐标对的问题...如果将工作分配给线程并重新收集它的开销比执行它,我不会感到惊讶在一个线程上。通过放入一些打印的调试输出,确保您的任务实际上同时运行,并确保它是相互交织的;使用较慢的任务,因此您肯定会在多核机器上看到加速。

以上是关于QProcess, QEventLoop - 可用于并行处理的主要内容,如果未能解决你的问题,请参考以下文章

关于 在海思3559AV100上使用QProcess和QStorageInfo获取磁盘总大小和可用大小失败 的解决方法

QEventLoop 的使用两例

本地 QEventLoop 是如何工作的

QEventLoop 没有同步等待 QNetworkReply 完成

与 QtCore.QEventLoop() 链接后无法单击 QRadioButton

关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)