デュアル モニターを使用する C# アプリケーションで複数のフォームを管理する最善の方法を見つけようとしています。アプリケーションは「ランチパッド」から始まり、オペレーターに簡単な情報と「GO」ボタンを提供します。そのボタンを押すと、ランチパッドが非表示になり、各モニターにフルスクリーンでフォームが表示されます。ここで関連するコードをキャプチャしようとしました:
private static List<Thread> _displays = new List<Thread>();
// "GO" button handler
private void OnClick(Object sender, EventArgs args) {
Launch(new Form1());
Launch(new Form2());
WaitForAllDisplays();
}
private static void Launch(Form form) {
Thread thread = new Thread(LaunchDisplay);
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start(form);
_displays.Add(thread);
}
private static void LaunchDisplay(Object obj) {
Form display = obj as Form;
// [snip] logic to place form on correct monitor [/snip]
display.ShowDialog();
}
public static void WaitForAllDisplays() {
foreach (Thread thread in _displays) {
thread.Join();
}
}
このWaitForAllDisplays()
呼び出しでメイン スレッドをブロックしたままにしておくのは少し面倒ですが、これを行うためのより良い方法を思いつきませんでした。Form1
とForm2
は互いに独立しており、直接通信することはありません。
すべてのディスプレイが閉じるのを待つためにカウンティング セマフォを使用することを検討しましたが、これは従来のセマフォとは少し逆です。リソースが利用可能になったときに実行する代わりに、すべてのリソースが返されるまでブロックしたいと考えています。
より良いアプローチについて何か考えはありますか?