2013-05-29 41 views
7

我想了解Qt的整个内部过程以及它如何在我使用不同的线程时工作。Qt主Gui和其他线程+事件循环

正如我了解(谷歌搜索和探索的Qt源代码),是如下:

  • 每个线程都有当地的“当前事件列表”和本地事件循环(如果我打电话给exec )与该列表进行交互。
  • QCoreApplication::postEvent(obj, e)obj的线程的“待处理事件列表”上追加(obj, e)对。
  • 每个线程都有一个本地“事件调度器”(QAbstractEventDispatcher specializations),其目的是读取系统事件。因此,对于不同的平台,它存在一个QEventDispatchWin,一个QEventDispatchUnix,一个QEventDispatchSymbian等等。对于gui事件,Qt拥有也QEventDispatchX11(从QEventDispatchUnix继承),S60(从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). 

如果quitexit被调用时,它将终止当前的processEvents调用,并返回exec,并将值传递给exit

几点采取考虑:

  1. 系统事件从未被推/贴:当它们从系统中产生,并翻译为QEvents,它们直接sended到它的目标对象。
  2. processEvent发生的同一个线程中调用目标对象成员函数(o.event())。

而现在,疑惑道:

  1. 由于postEvent是静态的,线程安全的功能,是否QCoreApplication在此事件处理系统中扮演什么样的角色?和QApplication?为什么他们必须尽快创建?
  2. 为什么QApplication/QCoreApplication对于获取系统事件是必需的,如果每个线程都有自己的“事件调度程序”?

任何关于我的定位的更正都是值得欢迎的。

回答

2

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

4.8 documenation状态:

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

但对于一般QThreads - 你会发现提供的链接描述QThreads作为QObject对象是围绕主题的包装所以QThreads,就像任何其他的QObject,要求QCoreApplication为了协调与互动通知/事件,例如,当线程完成。

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

在Maya的文章中,她提供了其中任务被分配到的QThread代替[即使用信号/插槽内被限定并且不超负荷的示例run()方法]。通过这种方式,您可以清楚地看到QCoreAppli提供的主事件循环阳离子仍然起着关键作用。

正如你可能已经知道的那样,围绕QThreads这个网站的主题已经有大量的讨论 - 而且Qt4已经有很好的文档了......对于Qt5 =(

+1

对不起,您的回复很快就回复了,直到今天我才意识到。 –