(Qt 5.15.2 での作業) 同じスレッドからシグナル (sig_responseReady) を受け取るメソッドがあります。このメソッドの目的は、応答が受信されるまで待機することです。このメソッドがシグナルを待っている間、このメソッドを呼び出すイベントが原因で、メソッドが再度呼び出されます (そのため、イベントループがネストされます)。ただし、スタック上の最初の waitForResponse は、最大 10 秒間 sig_responseReady シグナルを取得しません (理由はわかりません) が、後で呼び出された waitForResponse が最初にシグナルを取得します。
この設計の結果、入れ子になったイベント ループができました。これは、このスタック オーバーフローの投稿によると、スロット/シグナル処理エラーを引き起こし、回避する必要があります。これが私の問題の原因だと思います。
単一のイベントループだけで同じことを達成する設計はありますか? (思いつきません) waitForResponse を呼び出す関数は、waitForResponse が戻るまで一時停止する必要があります。..非同期にすることはできません。以下の関数で eventloop.exec を QCoreApplication::processEvents(QEventLoop::AllEvents,100) に置き換えてみましたが、それでも同じ奇妙な結果が得られます。(したがって、ネストされたイベントループは問題ではないかもしれません...しかし、原因はわかりません)
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);
}