2

最新のプロジェクトで MVP パターンを実装しようとしています。現在、C++ Builder 2007 に付属の VCL ライブラリを使用しています。私の考えでは、Application->Run() を実行する必要はなく、さらに悪いことに、メイン フォームを作成してそのフォームをループする Application->CreateForm() も必要ありません。メインフォームは必要ありません。代わりに、メインのPresenterが必要です。

私の質問は、スレッド化された TForms を作成する方法になりますか?

オプション 1: メッセージ ループ (プレゼンター) が 1 つしかない場合、システム内のすべてのランダム スレッドは、このメイン スレッドにメッセージを投稿し、フォームを作成する必要があります。

オプション 2: すべてのフォームに独自のメッセージ ループがあります。ランダムスレッドは、必要に応じて新規作成および削除できるようになりました。メッセージの投稿は、それらの間の通信に引き続き使用されます。

オプション2が推奨される場合、このアプローチの実装に関するアドバイスはありますか?

編集: newを 使用してフォームを作成し、ループが機能するようにするには、次のように変更するにはどうすればよいですか?

// Start VCL library
pApplication->Initialize();

// Create the Main form and assign the MainForm property
pApplication->CreateForm(__classid(TForm1), &pFormMain);

// Show the form
pFormMain->Show();

// Run the loop
pApplication->Run();
4

2 に答える 2

3

各フォームを独自のスレッドに配置しないでください。各フォームをメインスレッドに入れます。

スレッドにはメッセージ ループが 1 つしかありません。これに対する例外は、フォームがモーダルに表示されるときに実行される特別なメッセージ ループです。

pApplication->Run();メッセージループを実行します。投稿されたメッセージが処理されると、適切なウィンドウ プロシージャにディスパッチされます。メッセージが送信されると、ウィンドウ プロシージャに同期的に直接配信されます。

フォームをいくつでも作成して表示し、同じメッセージ ループからすべてのフォームにサービスを提供できます。これができるだけでなく、物事を行う方法です。

この知識を MVP フレームワークにどのようにマッピングするかは別の問題ですが、単一のスレッドから GUI を実行することは、どのソリューションでも固定ポイントです。

編集

メイン フォームが表示されていない場合に、VCL を使用してメッセージ ループを実行する方法を尋ねます。次の 2 つのオプションがあります。

  1. を呼び出す前に、非表示のフォームを作成しますpApplication->Run();
  2. 独自のメッセージ ループを実行します。

私の見解では、オプション 1 がはるかに優れたオプションです。

于 2011-03-12T18:55:39.590 に答える
1

VCL はスレッドセーフではないため、VCL を使用してスレッド化されたフォームを安全に作成することはできません。

また、各フォームにはすでに独自のメッセージ ループが含まれています。TApplication は、各フォームのループにメッセージをディスパッチするだけです。

于 2011-03-12T18:11:25.090 に答える