1

多くの計算を行う QThread があり (数分間実行できます)、1 つの (そして 1 つだけの) ポイントで、たとえば yes/no ダイアログの形式でユーザー入力が必要です。もちろん、スレッドはメイン スレッドではないため、GUI 要素にアクセスすることも、スレッドからダイアログを開くこともできません (Qt の設計上の選択)。

明らかな解決策はたくさんありますが、「推奨される」解決策または「ベスト プラクティス」に興味があります。

私のアイデア:

  1. GUI から入力を読み取る必要があるポイントは 1 つだけなので、2 つのスレッドを使用できます。2 つ目のスレッドは、ダイアログが評価された後に開始されます。問題: コードに柔軟性がなくなります。後でさらにダイアログを導入する必要がある場合はどうすればよいですか? 可能性は低いですが、発生する可能性があります。
  2. 私はスレッドを 1 つしか持っておらず、信号とスロットを両方向で通信します (逆方向ではなく、「スレッドからメインへ」の形式の信号のみを使用した経験があります)。スレッドが実行され、ユーザーの決定が必要なポイントに到達すると、スレッドはメイン (別名 GUI スレッド) にシグナルを送信し、メインはそれをスロットでキャッチし、ダイアログを作成し、結果を評価し、スレッドにシグナルを送信します。今何?run()スレッドはスロットでシグナルをキャッチしますが、計算が行われているメソッドにどのような影響を与えるべきでしょうか? がrun()終了すると、スレッドは終了します。だから私は自分のrun()関数にこのようなものを持っています:while (!can_continue) { sleep(); }そして私は設定しますcan_continueメインから送信された信号をキャッチしたスロットで。ただし、これが最もシンプルで最もエレガントなソリューションであることに疑問があります。私が知っておくべき一般的な慣行はありますか?
4

1 に答える 1

3

Qt スレッドを間違って操作しているため、2 番目のバージョンで問題が発生します。

class Worker: public QObjectシグナルを持つ新しいオブジェクトを作成する必要があります。

void stage1Finished();
void stage2Fibished();

およびスロット:

void startStage1();
void startStage2();

次に、Qthreadスレッドオブジェクトを作成し、スレッドにプッシュWorkerし、スレッドのシグナルに接続startStage1()し、シグナルでダイアログを表示し、 dialog-accepted-signalをに接続します。ねじ溝に接続します。started()stage1Finished()startStage2()stage2Finishedexit()

そうすれば、どこでも眠る必要はありません。すべての信号処理は、 の標準メカニズムを経由しQthreadます。次に、スレッドを開始して処理を開始finishedし、処理が終了したときにシグナルを取得します。

信号をスロットに接続するときは、 を使用しますQt::QueuedConnection

于 2012-07-28T14:23:24.187 に答える