1

私は、いくつかの処理を開始する (ジョブを実行するスレッドを開始する) トリガー関数を呼び出す必要があるライブラリを使用しており、すぐに戻ります。その後、処理が終了すると、シグナルが発行されます。

これは、さまざまなパラメータに基づいて定期的に行う必要があります。処理中にトリガー関数への他の呼び出しを実行してはならないため、何らかの方法でそれらをキューに入れる必要があります。QEventLoop (「ループ」) を使用することを考えましたが、今のところ運がありません。

このコードを見てください:

test::test()
    {
    connect(&timer,   SIGNAL(timeout()), this, SLOT(timerSlot()));
    connect(&timer2,  SIGNAL(timeout()), this, SLOT(timer2Slot()));
    connect(&library, SIGNAL(processingFinished()), &loop, SLOT(quit()));

    timer.setInterval(2000);
    timer.start();

    timer2.setInterval(4000);
    timer2.start();
    }

void test::timerSlot()
    {
    loop.exec();
    startProcessing(some_parameters);
    }

void test::timer2Slot()
    {
    loop.exec();
    startProcessing(some_other_parameters);
    }

問題は、処理中に loop.exec() が呼び出されると、次のメッセージが表示されることです。

QEventLoop::exec: instance xxxxxx has already called exec()

私が意図したことを行う正しい方法は何ですか?

前もって感謝します。

4

2 に答える 2

1

簡単な解決策の 1 つは、メンバ変数を導入することです。たとえば、 のbool m_isProcessing場合にのみ処理を開始し、処理の開始時m_isProcess == falseに に設定し、処理の完了時に にtrueリセットします。falseGUI/メイン スレッド上で実行するためのスロットなので、test QObjectタイマー スロットと処理が終了したときに実行されるスロットとの間の同期について心配する必要はありません。

処理中に発生するイベントを追跡したい場合は、同じ方法を使用できますtest。クラスにメンバー変数を導入して、必要な情報を追跡します。

于 2014-04-30T01:43:25.167 に答える
0

Qt::QueuedConnectionを探しているようです。

Qt::QueuedConnection 2 コントロールがレシーバーのスレッドのイベント ループに戻ると、スロットが呼び出されます。スロットは受信側のスレッドで実行されます。

したがって、次のように書くことができます。

connect(&timer, SIGNAL(timeout()), SLOT(timerSlot()), Qt::QueuedConnection);
connect(&timer2, SIGNAL(timeout()), SLOT(timer2Slot()), Qt::QueuedConnection);

詳細については、ワーカー スレッドを使用していますが、よく知られているマンデルブロの例を調べることができます。

マンデルブロの例

于 2014-04-26T17:00:03.357 に答える