9

我试图了解 Qt 的整个内部过程以及当我使用不同的线程时它是如何工作的。

据我了解(谷歌搜索和探索 Qt 源代码),如下所示:

  • exec每个线程都有一个本地“待处理事件列表”和一个与该列表交互的本地事件循环(如果我调用)。
  • QCoreApplication::postEvent(obj, e)将该对附加到's 线程(obj, e)的“待处理事件列表”中。obj
  • 每个线程都有一个本地“事件调度程序”(QAbstractEventDispatcher专门化),其目的是读取系统事件。因此,对于不同的平台,它存在 a QEventDispatchWin、 a QEventDispatchUnix、 aQEventDispatchSymbian等等。对于gui事件,Qt 也有QEventDispatchX11(inherits from QEventDispatchUnix)、S60(from Symbian) 等。

考虑到所有这些,exec呼叫的工作方式如下:

Thread's `exec`:
 ├ create a QEventLoop object.
 └ call QEventLoop.exec()
   └ call repeatedly eventDispatcher's processEvents with WaitForMoreEvents flag.
     ├ call to QCoreApplication::sendPostedEvents
     ├ while (!pending system events)
     │  ├ read system event
     │  ├ create an appropiate QEvent e and detect its target QObject o.
     │  └ call to QCoreApplication::sendSpontaneousEvent(o, e)
     └ call to QCoreApplication::sendPostedEvents
       (for new generated user events in the previous step).

如果quitorexit被调用,它结束当前processEvents调用并exec返回传递给的值exit

需要考虑的几点:

  1. 系统事件从不推送/发布:当它们从系统生成并转换为 QEvents 时,它们会直接发送到其目标对象。
  2. 目标对象成员函数 ( o.event()) 在发生的同一线程中调用processEvent

现在,怀疑:

  1. 既然postEvent是静态和线程安全的函数,那么 QCoreApplication 在这个事件处理系统中扮演什么角色呢?QApplication?为什么它们必须尽快创建?
  2. 如果每个线程都有自己的“事件调度程序”,为什么 QApplication/QCoreApplication 必须获取系统事件?

欢迎对我的假设进行任何更正。

4

1 回答 1

3

回答您的第二个问题,“如果每个线程都有自己的“事件调度程序”,为什么 QApplication/QCoreApplication 必须强制获取系统事件?”

4.8 文档指出:

“请注意,必须始终从主线程(执行 main() 的线程)调用 QCoreApplication::exec(),而不是从 QThread。在 GUI 应用程序中,主线程也称为 GUI 线程,因为它是唯一的线程允许执行与 GUI 相关的操作。”

但是对于一般的 QThreads - 您会发现提供的链接将 QThreads 描述为 QObjects,它是线程的包装器。因此,QThreads 与任何其他 QObjects 一样,需要 QCoreApplication 与之交互以协调通知/事件,例如当线程完成时。

http://qt-project.org/forums/viewthread/14806

在 Maya 的文章中,她提供了一个示例,其中任务被分配给 QThread,而不是在 [即使用信号/插槽并且不要重载 run() 方法] 中定义。这样一来,您就清楚地看到 QCoreApplication 提供的主事件循环仍然起着至关重要的作用。

正如您可能已经知道的那样,在这个站点上已经围绕 QThreads 主题展开了大量讨论——Qt4 的文档非常完善......不能对 Qt5 说同样的话 =(

于 2013-06-18T20:51:03.683 回答