かなり長い間私を悩ませてきた設計上の問題があります。基本的に、実行に時間がかかる関数と、応答性と最新性が必要な 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 をキャンセルする方法はありますか、またはこれを実装する他の方法はありますか。