QEventLoop 的使用两例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QEventLoop 的使用两例相关的知识,希望对你有一定的参考价值。

参考技术A 原文地址: https://blog.csdn.net/dbzhang800/article/details/6300519

Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道、,只是你可能没有意识到:

在 如何让 Qt 程序的 Sleep 和 QDialog 模态对话框与事件循环
两个短文中,我们可以看到 QEventLoop 的使用。那么?如何自己使用 QEventLoop 的,又有什么用呢?

Manual 中说的很简洁

在任何时候,你都可以创建一个QEventLoop的对象,然后调用它的exec() 来开始一个局部的事件循环。
看Manual容易让人头大,那么,看例子吧:

直接sleep一下行么,显然,如果你的用户不介意你的程序界面不响应用户操作,没问题!可是如果介意呢?
此时,开启一个局部的事件循环,让其执行100ms后自己退出,似乎很不错。写来看看:

注:让主线程等待有其他方法,此处略过。

不少人遇到过这个问题:在一个槽函数内创建了一个窗口对象,却没有看到窗口弹出来,或者看到窗口一闪而过。比如:

当然,大家都知道原因:因为到了后面的大括号处,dlg因为出作用域,会被析构掉。解决方法很简单,增大w的生存时间即可。比如:

能否用 QEventLoop 来解决呢?答案是,可以

恩至此,问题解决。其实,这也是 QDialog::exec() 内部所做的事情,只不过此处不是模态对话框而已。

QProcess, QEventLoop - 可用于并行处理

【中文标题】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 个随机坐标对的问题...如果将工作分配给线程并重新收集它的开销比执行它,我不会感到惊讶在一个线程上。通过放入一些打印的调试输出,确保您的任务实际上同时运行,并确保它是相互交织的;使用较慢的任务,因此您肯定会在多核机器上看到加速。

以上是关于QEventLoop 的使用两例的主要内容,如果未能解决你的问题,请参考以下文章

本地 QEventLoop 是如何工作的

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

QEventLoop 没有同步等待 QNetworkReply 完成

QProcess, QEventLoop - 可用于并行处理

何时以及如何使用 PySide QEventLoop

QEventLoop 仅等待本地事件而不是主循环事件