- - PR -
Invokeメソッド実行で処理が止まる
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-06-26 20:58
説明が難しいですが以下のようなことを行いたいと思いコードを書いてみましたが
うまくいきませんでした。 ・メインフォーム(AAAAA.DLL) ボタン押下時に、BBBBB.DLLに存在するクラスの処理を「別スレッド」で実行する。 またその経過を別のフォームで表示する。 ・処理を行うworkerクラス(BBBBB.DLL) 処理の経過をイベントを発生させることで通知。 第一段階としてBBBBBのイベントをメインフォームでハンドルし自身のテキストを変更 するといったことを行うために以下のコードを書きました。 ※メインフォーム(AAAAA.DLL) Public Class Form1 Private Sub Button1_Click( _ ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Dim th As New Threading.Thread(AddressOf DoWork) th.Start() th.Join() Me.Text = "処理完了" End Sub Private Sub DoWork() Dim worker as New BBBBB.WorkerCls AddHandler worker.SendMessageEvent, AddressOf AcpSendMessageEvent worker.DoWork() End Sub Private Sub AcpSendMessageEvent(msg As String) If Me.InvokeRequired Then 'ここで止まる Me.Invoke(New BBBBB.WorkerCls.SendMessageEventHandler( _ AddressOf AcpSendMessageEvent), msg) Else Me.Text = msg End If End Sub End Class ※ 処理を行うworkerクラス(BBBBB.DLL) Public Class WorkerCls Public Delegate Sub SendMessageEventHandler(msg As String) Public Event SendMessageEvent As SendMessageEventHandler Public Sub DoWork() RaiseEvent SendMessageEvent("処理したよ") End Sub End Class Exceptionでも発生してくれれば何が悪いのか分かるのですが、何もおこらず 止まってしまうので困っています。どなたかご教授お願いします。 環境 Windows Vista Ultimate Microsoft Visual Studio 2005 Version 8.0.50727.867 Microsoft .NET Framework Version 2.0.50727 | ||||
|
投稿日時: 2008-06-26 21:49
いわゆるデッドロックというやつです。
> th.Start() > th.Join() ここでワーカーの方のスレッドが終わるまで、メインのスレッドはブロックされています。 ワーカーからのイベントでInvokeしようとすると、メインのスレッドがメッセージを処理できるようになるまで待機しますので、ここで永久に停止します。 ※メインのスレッドはブロックされているので、ワーカーが終わらないと処理を続行できない。 | ||||
|
投稿日時: 2008-06-27 11:12
なるほど!! @Join以降の処理を別メソッドにする。 AMethodInvokerを使用しAsyncCallBackにそのメソッドのアドレスを指定。 という方法に変更し、うまくいきました。 ありがとうございました。 |
1