0

(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);
}
4

0 に答える 0