0

かなり長い間私を悩ませてきた設計上の問題があります。基本的に、実行に時間がかかる関数と、応答性と最新性が必要な GUI があります。ユーザーが開始ボタンを押すと、長い関数が while ループで実行を開始し、各実行後に GUI を更新する必要があります。

これを行う最善の方法は、QThread を while ループで実行することであり、ユーザーが開始ボタンを押すと、長い関数の実行が開始されると考えていました。次のようになります。

class Application : public QThread
{
    void run (void)
    {
        while (!mExiting)
        {
            if (StartPressed)
                LongFunction();

            // Need to update gui before
            // running long function again
        }
    }
}

QMetaObject::Invoke を BlockingQueuedConnection で実行しようとしましたが、GUI アプリケーションが終了すると、スレッドがスタックして終了しません。QMutex も使用してみましたが、GUI はロックされ、長い関数によって使用されているミューテックスを待ってロックされます。

アプリケーションが終了したいときに BlockingQueuedConnection をキャンセルする方法はありますか、またはこれを実装する他の方法はありますか。

4

1 に答える 1