3

通常のシナリオでは、何か役に立つ MFC/Win32/WTL/wxWidgets/Qt アプリケーションがあります。シングルスレッドになるように設計されており、処理ブロック内のエラー/質問を処理するロジックがいくつかあります。

そのため、クラスの奥深くで、ユーザーに「アクションを完了してもよろしいですか?」/「ドキュメント レイアウトでエラーが発生しました」などのダイアログを表示することができます。

問題は、ダイアログが計算量の多い/strightforward コードから起動されることです。FFT/画像の鮮明化/ファイル システムのデフラグ機能、または線に沿った何かのように。GUI でない場合は、ワーカー スレッドで簡単に起動できます。ユーザーにとって非常に迷惑なGUIの停止を回避するため、そこに適しています。

ただし、GUI はワーカー スレッドでは機能せず、依存性注入を実行することはほとんど不可能です。someclass instance(data_in, data_out, param1, param2, GUI_class_ref) : m_GUI(GUI_class_ref), ...3 つ以上のレベルの深さのように、クラス インターフェイスの観点から非常に不潔な方法で。

コードが複数のスレッドに分割されている場合、GUI プロンプトをメインスレッドにマーシャリングし、結果を計算コードのコアに戻すために使用できる、そのようなシナリオのパターン/チェックリストはありますか?

4

2 に答える 2

2

同期コンテキストを作成できます。メインスレッドによって実行されるコマンドのキューです。ワーカー スレッドは、このキュー (シングル スレッド アクセスのためにロックする必要があります) にコマンドを追加し、待機します。メイン スレッドはこのキューを定期的に処理し、コマンド (「操作のキャンセル」ダイアログなど) を実行し、ワーカー スレッドに結果を通知します。
C# では、デリゲートとそれらを呼び出す引数を使用してこれを行っていました。C++ では、列挙型コード化されたメッセージをスイッチで処理することができます (Windows プログラムのメッセージのように)。または、メンバー関数へのポインター + オブジェクト ポインターからそれらを呼び出す + 引数で呼び出す何かを作成します。

于 2012-06-06T05:03:40.833 に答える
2

あなたは、古典的な古いコードのリファクタリングの岐路に立っています。適切な分離と依存性注入は実行不可能であるため、GUI コンテキストをグローバルにアクセス可能にする必要があります。それはシングルトンを作成しています。必ずしも直接 GUI コンテキストである必要はないため、少なくともある程度の分離が達成されます。これは、GUI コンテキストを持ち、計算コードからの特定の 1 つの目的の呼び出しのみを受け入れるある種のマネージャーである可能性があります。GUI スレッド クラスをこのマネージャーのフレンドにして、GUI コールバック (ダイアログを閉じたとき) を非公開にすることができます。

まったく同じ課題(既存の重いアプリのスレッド化)を経験したので、何を書くべきかをより具体的なアイデアを与えることができました。しかし、GUI スレッドだけを自由に実行したいのか、それともバックグラウンド計算も実行したいのか、私は混乱しています。あなたが提供したダイアログプロンプトの例は、続行するかどうかを知るために回答する必要がある決定を示唆しているため、混乱しています (これは、計算が保留されていることを意味します)。

于 2012-06-07T09:25:08.673 に答える