私は、ネットワークコードのために呼び出されている一連のメソッドを持っています。ネットワークスレッドからイベントが発生します。このイベントの中で、私はシングルトンクラスからフックしています。メッセージをフォームレベルのメソッドにルーティングし、フォームロード時に登録して、気になる特定のメッセージを処理します。これらのフォームメッセージフックの中で、私は現在のフォーム(私ができた)を閉じる必要があるだけでなく、別のもの(私にトラブルを与えている)を表示する必要があります。VB.NET Form.Showの別のスレッドからフォーム
新しい形式のショーですが、ハングしている/更新していません。 .Show()は基本的に別のスレッドから呼び出されています(並べ替え)にはメッセージループがありませんが、これを解決する方法が他には分かりません。受信されるネットワークメッセージは、クライアントマシン上でどのフォームを閉じて表示するかを示します。
フローが混乱する可能性がありますので、説明してみてください。
ログインフォームは、そのフォーム内のユーザー定義関数をシングルトンクラスのメッセージリストに結び付けます。たとえば、LOGIN_STATUSというメッセージが発生した場合、このシングルトンクラスで定義されているリストにLoginフォームの関数を割り当てます。
シングルトンクラスには、実際に別のスレッドで実行されるネットワーククラスが定義されていますが、これはすべてクラス内で処理されます。プライベートctorでは、このネットワーククラスのOnDataイベントを購読します。
OnDataがネットワーククラスからシングルトンクラスに起動されると、OnDataはデータ型を渡します。関数ポインタのリストをループして、LOGIN_STATUSにリンクされているかどうかを確認します。これにより、ログインフォーム機能が呼び出されます。その機能の中で、私はログインフォームを閉じてロビーフォームを開く必要があります。それはロビーのフォームが表示されますが、ハングアップして更新していないときです。
希望は意味があります。
これはVB.NETで行われています。ここでは、「最後のフォームが閉じたときに閉じる」という設定があります。 VB.NETでは、フォームのリストを保持しなくても、formname.Show()だけでフォームを管理しやすくなり、C#のように自分自身を管理する必要がなくなり、理想的なソリューションでは可能です。
これは私がやっていることであり、それはまだハングアップしています。上記のあなたの方法私は少し修正されたバージョン(それは非常に似ている)をモジュール内に持っています。私はその後、私はセカンダリスレッドから開きたいフォームでそれを呼び出すが、私はInvokeRequiredを開くにはfalseを返すように私は私の2番目のフォームでショーを呼び出すように見えるので、単にそれがハングする原因になります。 – user441521
ああ、私はフォームの.Show()メソッドを他のスレッドから直接呼び出すため、OpenFormEvent()をUIスレッドのメソッドとして配置し、次に私の他のスレッドInvoke OpenFormEvent()をメインスレッドに配置することを意味します。多分私は家に帰るときにこれを試してみるだろう。 – user441521
'MainForm'スレッドで' Dim SecondForm As As New Form() 'が呼び出されます。それは不可欠です!フォームは、作成されたスレッドに属します。 –