2010-01-15 74 views
10

我从非Qt线程调用emit signal1()。 非Qt线程我的意思不是来自GUI Event Loop,也不是来自任何QThread run()方法或任何QThread自己的事件循环。从非Qt线程或外部Qt主事件循环中发出Qt信号,并且在4.5

它只是一个调用发出信号的QObject的方法的pthread(pthread_create())。

例如:

MyQbject: public QObject 
{ 
... 
void emitBunchOfSignals() 
{ 
emit signal1(); 
emit signal2(); 
... 
} 
... 
} 

我的并行线程的“运行”方法,它有一个指向MyObject的实例(实例是主要的Qt的图形用户界面线程不是上下文并行线程中创建)调用emitBunchOfSignals()方法。

在Qt 4.5之前,这是讨厌的。现在,Qt 4.5是如何处理这个问题的? 它是否调用qApp->PostEvent()或其他东西,使信号在Qt GUI线程(以及插槽中)内发射?

感谢

+0

当您调用connect时,您可能会显式地将类型设置为排队连接。 – 2010-01-15 15:46:42

+0

在你写下这个问题的时候,你可以打开代码并寻找自己。 – shoosh 2010-01-15 16:00:04

+0

它似乎并没有像Qt 3.xx一样崩溃。 我熟悉连接选项(直接连接queuedconnection等),但我认为它只能在QTreads或QThread和主事件循环之间起作用。为什么它曾经与Qt 3.xx一起崩溃,至少通过查看代码并不是直截了当的理解。我疯了吗 ? – 2010-01-15 16:10:27

回答

8

你需要知道什么是您使用的线程来一个一个排队的连接,因为Qt可以不autmatically意义上的对象属于哪个线程(“线程亲和力”是在使用的术语文档)。连接时你这样做:

connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection); 

这将导致信号被提上目的地的事件循环,而当它的线程运行(即它的事件循环)被调用的插槽。

+3

非常感谢。 为了确保我理解你的意思: 由于我发出的QObject不属于QThread,也不属于主Qt GUI线程(它实际上属于我的Corba线程),所以Qt无法感知线程关联。因此,我必须强制连接到QueuedConnection,因为在此特定情况下,AutomaticConnection不起作用。 但是,当发射的QObject属于QThread时,Qt可以感知线程的相关性,并且自动连接将对接收器的QObject线程的Event循环执行必要的后处理。 – 2010-01-18 12:45:04