- PR -

Invokeメソッド実行で処理が止まる

1
投稿者投稿内容
どらい
会議室デビュー日: 2007/07/12
投稿数: 6
投稿日時: 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

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-06-26 21:49
いわゆるデッドロックというやつです。

> th.Start()
> th.Join()

ここでワーカーの方のスレッドが終わるまで、メインのスレッドはブロックされています。
ワーカーからのイベントでInvokeしようとすると、メインのスレッドがメッセージを処理できるようになるまで待機しますので、ここで永久に停止します。
※メインのスレッドはブロックされているので、ワーカーが終わらないと処理を続行できない。
どらい
会議室デビュー日: 2007/07/12
投稿数: 6
投稿日時: 2008-06-27 11:12
引用:

なちゃさんの書き込み (2008-06-26 21:49) より:
いわゆるデッドロックというやつです。



なるほど!!

@Join以降の処理を別メソッドにする。
AMethodInvokerを使用しAsyncCallBackにそのメソッドのアドレスを指定。

という方法に変更し、うまくいきました。
ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)