• 9487阅读
  • 5回复

QT里面可以在非GUI线程里发个事件,让GUI线程执行完后再返回呢?老问题 [复制链接]

上一主题 下一主题
离线secondwang
 
只看楼主 倒序阅读 楼主  发表于: 2009-05-21
QT里面可以在非GUI线程里发个事件,让GUI线程执行完后再返回呢?
我想在一个非GUI线程里发事件到GUI线程,然后让GUI线程处理完后再返回到非GUI线程,做进一步处理,QT里QPainter之类的函数只能在GUI线程里完成吧。我就想做个类似windows下的SendMessage,处理完后再返回,虽然这样可能会导致退出时候死锁,所以更希望让发送的事件能马上执行,也就是让事件的优先级最高,processEvent最优先处理这个事件?
离线hercules

只看该作者 1楼 发表于: 2009-05-21
你可以这么做
YourThread::run()
{
    emit your_signal();
}

connect(sender,signal,receiver,slot,Qt::BlockingQueuedConnection);

但是用的不好的话会死锁
我的QQ号:337396132
欢迎大家加我为好友,一起学习Qt
离线secondwang
只看该作者 2楼 发表于: 2009-05-22
emit 是执行后才返回吗? 还是发送后不等执行就返回呢?
离线hercules

只看该作者 3楼 发表于: 2009-05-23
signal/slot目前有三种调用方式
1.DirectConnection
和以前一样,在emit处直接invoke你的slot函数,一般情况是sender,receiver在同一线程

2.QueuedConnection
将发送Event给你的receiver所在的线程
postEvent(QEvent::MetaCall,...)
slot函数会在receiver所在的线程的event loop中进行处理,一般情况是sender,receiver不在同一线程

3.BlockingQueuedConnection
调用sendEvent(QEvent::MetaCall,...),在receiver所在的线程处理完成后才会返回;只能当sender,receiver不在同一线程时才可以
我的QQ号:337396132
欢迎大家加我为好友,一起学习Qt
离线secondwang
只看该作者 4楼 发表于: 2009-05-25
非常感谢你的回答
离线archldx
只看该作者 5楼 发表于: 2009-05-31
理解了,西谢谢啊
快速回复
限100 字节
 
上一个 下一个