Multithreading 使用at 4.5从非Qt线程或外部Qt主事件循环发出Qt信号

Multithreading 使用at 4.5从非Qt线程或外部Qt主事件循环发出Qt信号,multithreading,qt,qt4,Multithreading,Qt,Qt4,我正在从非Qt线程调用一个emit signal1()。 非Qt线程指的是不来自GUI事件循环,也不来自任何QThread run()方法或任何QThread自己的事件循环 它只是一个pthread(pthread_create())调用发出信号的QObject的方法 例: 我的pthread的“run”方法有一个指向MyObject实例的指针(该实例是在主Qt GUI线程上下文中创建的,而不是pthread)调用emitBunchOffSignals()方法 在Qt 4.5之前,这很糟糕。现在

我正在从非Qt线程调用一个
emit signal1()
。 非Qt线程指的是不来自GUI事件循环,也不来自任何QThread run()方法或任何QThread自己的事件循环

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

例:

我的pthread的“run”方法有一个指向MyObject实例的指针(该实例是在主Qt GUI线程上下文中创建的,而不是pthread)调用
emitBunchOffSignals()
方法

在Qt 4.5之前,这很糟糕。现在,Qt4.5能处理这个问题吗? 它是否调用了
qApp->PostEvent()
或其他什么东西,以便在Qt GUI线程中发出信号(因此也会在插槽中发出信号)


谢谢

您需要确保的是使用到来自线程的队列连接,因为Qt无法自动检测属于哪个线程的对象(“线程关联”是文档中使用的术语)。您可以在连接时执行此操作:

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

这将导致信号放在目标的事件循环上,并在其线程运行时调用插槽(即其事件循环)。

调用connect时,您可以显式地将类型设置为queued connection。在您写下此问题所花的时间内,您可以打开代码自己查找。这似乎不像Qt 3.xx以前那样直接崩溃。我熟悉connect选项(directconnectionqueuedconnection等),但我认为它只在QTreads之间或QThread与主事件循环之间起作用。通过查看代码,至少不能直接理解为什么Qt3.xx会崩溃。我疯了吗?@Nicolas-一些线程代码和必要的背景使得很难理解发生了什么。有很多东西可以浏览,比如线程池、moc和其他。非常感谢。为了确保我理解您的意思:因为我发出的QObject既不属于QThread,也不属于主QtGUI线程(实际上它属于我的Corba线程),所以Qt无法感知线程相关性。因此,我必须强制连接到QueuedConnection,因为AutomaticConnection在这种特定情况下不起作用。但是,当发出的QObject属于QThread时,Qt可以感知线程关联,并且自动连接将向接收方QObject线程的事件循环进行必要的post。
connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection);