5

QApplication::exec()を呼び出さずにQtを使用する安全な方法はありますか?

複数のリソースで長期間有効なプロセスを実行しているさまざまなオブジェクトが多数あります (少なくともそのうちの 1 つは Web アプリケーション サーバーと通信しています)。これらのさまざまなプロセスの適切なタイミングでユーザーに入力を求める GUI アプリケーションを作成しています。「フロー」ロジック (次に何をすべきかを決定するロジック) を、ダイアログ クラスのような GUI オブジェクトではなく、1 つの場所に配置したいと考えています。私は次のようなことができると考えていました:

...

wait_dialog dlg;
dlg.setModal( false );
dlg.show(); // Should return...

netobject.start_long_lived_process_that_happens_on_other_thread( &completion_callback );
while ( !completion_callback_called() )
{
    qApp->processEvents();
    netobject.pump_callbacks();
    magically_avoid_busywait_while_still_servicing_qt_somehow();
}

dlg.hide();

...

Qtの観点から、これは安全ですか?実装する「良い」方法はありますmagically_avoid_busywait_while_still_servicing_qt_somehow()か?

ここで達成しようとしているのは、処理フローを可能な限り明確な方法で記述することです。これを行う単一の関数が欲しい:

 show_a_non_modal_wait_dialog()

 start_some_processing_1()

 wait_for_processing_1_to_finish()

 dismiss_non_modal_wait_dialog()

 show_modal_input_dialog()

 if ( cancelled ) return

 show_a_non_modal_wait_dialog()

 start_some_processing_2()

 wait_for_processing_2_to_finish()

 dismiss_non_modal_wait_dialog()

 show_modal_input_dialog()

 if ( cancelled ) return

 ...

私が本当に避けたいのは、Qt ウィジェットとウィンドウ内で処理を開始して待機することです。また、処理オブジェクト自体は Qt から完全に独立しています。私がやろうとしているのは、いくつかのヘルパー コールバックとステータス変数を使用して、1 つの関数でコントローラーを作成することだと思います。

4

1 に答える 1

5

必要なのは、アプリケーションのメイン イベント ループ以外のイベント ループです。これは、次を使用して実行できますQEventLoop

wait_dialog dlg;
dlg.setModal( false );
dlg.show(); // Should return...

QEventLoop loop;
connect(&netobject, SIGNAL(done()), &loop, SLOT(quit()));
netobject.start_long_lived_process_that_happens_on_other_thread();

loop.exec(); // BLOCKING (non-busy) until quit() is called via the signal done()

これは (私の目には) クリーンなコードですが、netobject クラスが QObject であり、シグナルを実装する必要がありますdone()(コールバックを提供するよりもクリーンです)。

これで、このコード全体を関数でラップして、それ自体がブロック呼び出しになるため、必要に応じてダイアログからいくつかの結果を返すことができます。

于 2012-10-03T23:45:48.833 に答える