(使用 Qt 5.15.2)我有一个从同一个线程接收信号(sig_responseReady)的方法。此方法的目的是等待收到响应。在此方法等待信号时,由于调用此方法的事件(因此事件循环被嵌套)而再次调用该方法。但是,堆栈上的第一个 waitForResponse 最多 10 秒都没有收到 sig_responseReady 信号(我看不到任何原因),而后来调用 waitForResponse 则首先获得他们的信号。
这种设计的结果是我有嵌套的事件循环,根据这个stackoverflow帖子会导致插槽/信号处理错误,应该避免。我怀疑这是我的问题的原因。
有没有一种设计可以实现相同的效果,只有一个事件循环?(我想不出来)调用 waitForResponse 的函数必须暂停,直到 waitForResponse 返回。..我不能让它异步。我尝试在下面的函数中用 QCoreApplication::processEvents(QEventLoop::AllEvents,100) 替换 eventloop.exec ,但仍然得到相同的奇怪结果。(所以也许嵌套事件循环不是问题......但我无法找出原因)
MyClass::SRequest MyClass::waitForResponse(const QUuid queryID) {
reentryCount++; // Static var to determing nesting/depth count
QEventLoop eventloop;
qDebug() << "MyClass::waitForResponse connect for uid " << queryID << ", depth " << reentryCount;
connect(this,&MyClass::sig_responseReady,&eventloop, &QEventLoop::quit); //, Qt::QueuedConnection); // Allow matching response to stop eventloop
do {
eventloop.exec();
qDebug() << "MyClass::waitForResponse got signal for uid " << queryID;
} while (!queryResponseReady(queryID) && !queryExpired(queryID));
qDebug() << "MyClass::waitForResponse exitted loop for signal for uid " << queryID << ", depth " << reentryCount;
reentryCount--;
return queryTakeResult(queryID);
}