2011-07-25 15 views
0

私は、ネットワークコードのために呼び出されている一連のメソッドを持っています。ネットワークスレッドからイベントが発生します。このイベントの中で、私はシングルトンクラスからフックしています。メッセージをフォームレベルのメソッドにルーティングし、フォームロード時に登録して、気になる特定のメッセージを処理します。これらのフォームメッセージフックの中で、私は現在のフォーム(私ができた)を閉じる必要があるだけでなく、別のもの(私にトラブルを与えている)を表示する必要があります。VB.NET Form.Showの別のスレッドからフォーム

新しい形式のショーですが、ハングしている/更新していません。 .Show()は基本的に別のスレッドから呼び出されています(並べ替え)にはメッセージループがありませんが、これを解決する方法が他には分かりません。受信されるネットワークメッセージは、クライアントマシン上でどのフォームを閉じて表示するかを示します。

フローが混乱する可能性がありますので、説明してみてください。

ログインフォームは、そのフォーム内のユーザー定義関数をシングルトンクラスのメッセージリストに結び付けます。たとえば、LOGIN_STATUSというメッセージが発生した場合、このシングルトンクラスで定義されているリストにLoginフォームの関数を割り当てます。

シングルトンクラスには、実際に別のスレッドで実行されるネットワーククラスが定義されていますが、これはすべてクラス内で処理されます。プライベートctorでは、このネットワーククラスのOnDataイベントを購読します。

OnDataがネットワーククラスからシングルトンクラスに起動されると、OnDataはデータ型を渡します。関数ポインタのリストをループして、LOGIN_STATUSにリンクされているかどうかを確認します。これにより、ログインフォーム機能が呼び出されます。その機能の中で、私はログインフォームを閉じてロビーフォームを開く必要があります。それはロビーのフォームが表示されますが、ハングアップして更新していないときです。

希望は意味があります。

これはVB.NETで行われています。ここでは、「最後のフォームが閉じたときに閉じる」という設定があります。 VB.NETでは、フォームのリストを保持しなくても、formname.Show()だけでフォームを管理しやすくなり、C#のように自分自身を管理する必要がなくなり、理想的なソリューションでは可能です。

答えて

2

すべてのフォームが同じスレッドで作成され、同じメッセージループが作成されるようにするには、mainのInvokeメソッドを使用します。 Form.InvokeForm.BeginInvokeメソッドは、フォームのメッセージループからコードを実行させます。 BeginInvokeは、イベント呼び出しスレッドをすぐに戻すことができます。ここでは、メソッドが完了するまでInvokeがイベントスレッドをブロックします。それはあなたのコードがどれほど時間に依存するかによって異なります。

Private Sub OpenFormEvent(sender As Object, e As EventArgs) 
    If MainForm.InvokeRequired Then 
     Dim args As Object() = {sender, e} 
     MainForm.BeginInvoke(New EventHandler(AddressOf OpenFormEvent), args) 
    Else 
     Dim SecondForm As New Form() 
     SecondForm.Show() 
    End If 
End Sub 
+0

これは私がやっていることであり、それはまだハングアップしています。上記のあなたの方法私は少し修正されたバージョン(それは非常に似ている)をモジュール内に持っています。私はその後、私はセカンダリスレッドから開きたいフォームでそれを呼び出すが、私はInvokeRequiredを開くにはfalseを返すように私は私の2番目のフォームでショーを呼び出すように見えるので、単にそれがハングする原因になります。 – user441521

+0

ああ、私はフォームの.Show()メソッドを他のスレッドから直接呼び出すため、OpenFormEvent()をUIスレッドのメソッドとして配置し、次に私の他のスレッドInvoke OpenFormEvent()をメインスレッドに配置することを意味します。多分私は家に帰るときにこれを試してみるだろう。 – user441521

+0

'MainForm'スレッドで' Dim SecondForm As As New Form() 'が呼び出されます。それは不可欠です!フォームは、作成されたスレッドに属します。 –

関連する問題