3

20種類のクラスを利用したアプリケーションがあります。プログラムの実行はメインウィンドウで開始されます。進行状況ダイアログを開始します。さまざまな目的のためにさまざまなクラスを利用します。実行が特定のクラスに行き、必要なことを実行してメインウィンドウクラスに戻る各関数呼び出しの後、進行状況ダイアログを更新します。ここで問題となるのは、実行がメインウィンドウクラスから離れると、進行状況ダイアログがフリーズすることです。キャンセルボタンにアクセスできないため、必要な時間に実行を停止できませんでした。

mainclass :: mainclass(){

ProgressDialog-> exec();

x->add();

updateProgressDialog();

y->do();

updateProgressDialog();

zz->bring();

updateProgressDialog();

}

// x、y、zは3つの異なるクラスです。

これが実行の流れです。メインクラスに関数を入力するとすぐに、進行状況ダイアログが開始されます。異なるクラスから関数を呼び出します。機能にはかなりの時間がかかります。実行部分を実行するためにスレッドを呼び出しましたが、進行状況ダイアログをキャンセルできません。進行状況ダイアログでキャンセルボタンが押されたときに、プログラムの実行を停止したい。

この問題を解決する方法を教えてください。私がここではっきりしていることを願っています。

4

2 に答える 2

1

スレッドで実行されている計算を正確に把握しなければ、問題を特定するのは困難です。多分これが役立つかもしれません:GUIの応答性を保つ

抜粋: Performing Long Operations (by: Witold Wysota)
長い計算中 (シグナルとスロットの使用に関係なく)、すべてのイベント処理が停止します。その結果、GUI が更新されず、ユーザー入力が処理されず、ネットワーク アクティビティが停止し、タイマーが起動しません。アプリケーションはフリーズしているように見えます。凍った。

于 2010-08-16T20:54:25.733 に答える
0

呼び出している関数は、Qt イベント ループを処理していません。exec() を呼び出しているため、モーダル プログレス バーを使用しています。これは、Qt がダイアログを更新したときにのみ制御を取得することを意味します。

これを回避する唯一の方法は、ダイアログをモードレスとしてコーディングすることですが、イベント ループを処理する機会も提供する必要があります。

これは、Qt docs: QProgressDialogでかなり詳細に説明されています。

于 2010-08-16T22:59:40.050 に答える