QT多线程间通信
假设有2个线程:gui线程、工作线程,它们间相互有不定期的消息通信,这2个线程能否象MFC,每个线程都用自己的消息队列来处理线程间通讯,而不必用信号/槽。好多例子中的工作线程如下:
run
{
while(flag)
{
sleep(X);
}
}
工作线程中的while循环中使用sleep感觉非常不合适,因为你不知道什么时候有消息要发送过来,也许你刚sleep就有消息发过来了,这样就需要等到sleep完成后再来处理这个消息。
如果能象MFC中,每个线程都有自己的消息队列,在消息队列里一个case一个case的处理,多方便。
谢谢!
--------------------编程问答-------------------- 用std::condition_variable,不要用sleep
比如这个例子QT线程间阻塞通信
消息队列自己建一个就好了,访问消息队列的时候通过std::mutex保护这个队列。 --------------------编程问答-------------------- QThread objects can communicate with each other by posting events with QCoreApplication::postEvent(QObject* receiver, QEvent* event) and processing them by overriding the operation bool QObject::event(QEvent* e). --------------------编程问答-------------------- 不用signal-slot的话就用postEvent吧。自己写一些custom event --------------------编程问答-------------------- 你可以研究一下QApplication::postEvent和QApplication::sendEvent,结合QObject中的bool QObject::event ( QEvent * e ) [virtual]来使用。 --------------------编程问答-------------------- 每个QThread的run内部默认启动有自己的事件循环:QThread::exec()
QApplication::postEvent() 以及 queue的信号槽都是借助这个东西来实现的。 --------------------编程问答-------------------- 为何不用信号槽呢? --------------------编程问答-------------------- 难道你不知道信号槽也有消息队列的方式么?那么方便不会用,可惜了 --------------------编程问答-------------------- 多谢各位热心人!
看了 masterz 推荐的2个链接,基本意思明白了,不知说的对不对:
1、信号/槽在直接连接时就是调用关系,在队列连接时就消息队列了;
2、信号/槽的收发是面向对象体的,不是面向过程(类似于MFC),postEvent也是面向对象体的,当对象体依附于不同的线程时(比如 ObjectA依附于GUI线程,ObjectB依附于work线程),postEvent发送的消息被目标对象体接收并处理;
进一步的几个问题:
1、线程是否可以处理不依附于本线程的对象?
2、每个线程在运行了exec()后,怎么查看它的消息处理队列?
2、在Qt4.8.4版本中,QThread::postEvent()不存在了,是否意味,在所有线程中,都只能用QApplication::postEvent() 来发送消息?
谢谢!
--------------------编程问答-------------------- 关注一下,以往类似问题都是用跨线程的slot处理的。 --------------------编程问答-------------------- 关注一下,以往类似问题都是用跨线程的slot处理的。
补充:移动开发 , Qt