我有一个派生自的类QThread
: class MyClass : public QThread
该类与另一个对象的插槽相连。最初这是连接为Qt::AutoConnection
. 但是然后 - 一旦线程启动(MyClass::run()
) - 信号不再“到达插槽”(为什么?)。
// connected before myObject->run()
s = QObject::connect(
_myObject, SIGNAL(signalLogMessage(const QString&, QtMsgType)),
this, SLOT(slotLogMessage(const QString&, QtMsgType)), Qt::DirectConnection);
我的第一个想法是我需要强制Qt::QueuedConnection
(this
/_myObject
将是跨线程的)。在这种情况下,它根本不起作用。只Qt::DirectConnection
工作。线程启动后,恕我直言Qt::QueuedConnection
是正确的选择(跨线程)。
知道出了什么问题吗?连接本身似乎是正确的,否则它无法正常工作(意味着即使不使用Qt::DirectConnection
)。
编辑 1:——截至海德的回答/尼科斯的评论
截至目前,我认为海德的回答/尼科斯的评论指出了根本原因。我QThread
正在为另一个应用程序运行它自己的消息循环。这就是为什么它在自己的线程中运行并且基本上是一个无限循环的原因
run() {
// exec(); // while not reached
while (_runMessageLoop && ...) {
hr = CallDispatch(.....);
if (hr== 0) QThread::msleep(100);
// QCoreApplication::processEvents();
}
}
猜猜由于这个无限循环,Qt 消息循环没有运行,并且没有处理任何信号/插槽(这是正确Qt::DirectConnection
的吗?)当直接调用方法而不需要 Qt 消息循环时,这可能是唯一的原因连接类型工作。
现在的问题是,如何将 Qt 和我自己的消息循环结合起来(如果可行的话)?无法在循环之前调用 exec() (因为它在 Qt 循环中),并且只是QCoreApplication::processEvents();
在“我的循环”中仍然无法正常工作。
=> 在此处查看新问题:如何结合自己的消息循环和 Qt 事件循环?