QEventLoop 与 Looper 功能基本相同,实现方式大致也相同,都可以在线程中开启一个消息循环,分发消息。下面对比两种结构实现消息派发的实现方式。
1.QEventLoop 和 Looper 每个线程中都只能有一个。
2.消息队列
每个线程都有一个消息队列,Qt 的消息队列在QThredData中保存,QThredData中还保存一个QEventDispatcher用来派发消息, Looper的消息队列直接保存在looper中。
3.添加消息
Qt使用QApplication::PostEvent()向消息队列中添加消息(事件),PostEvent中有个Receiver参数从中获取receiver所在线程的消息队列,Looper使用Handler sendMessage 等添加。
4.开启消息循环
QEvetnLoop::exec() 与 Looper.loop(),做的事情基本一样,一个死循环中派发消息。
5.派发消息
Qt通过QEventLoop::processEvent()->QThredData::eventDispatcher::processEvent()->QApplication::sendPostedEvents 从QThredData保存的消息队列中拿出消息,派发给QObject::event处理。Qt实现信号槽的QueuedConnection也是通过post消息的方式实现。
Looper 在 loop函数中调用Handler.handlerMessage()处理消息派发。