■12226 / inTopicNo.6) |
Re[5]: AddHandler先からのコントロール操作 |
□投稿者/ ダッチ (177回)-(2008/01/05(Sat) 15:03:47)
|
> AddHandler hProcess.Exited, AddressOf DOS_Exited
この部分を完全に無視していました。(すみません)
Exited イベントは非同期(別スレッド)で通知されるため、
My.Forms.Form1 の Label1 に対して非表示にしても、
意図した動きになりません。
コントロールにアクセスするためには、
そのコントロールを作成したスレッドからアクセスしなければいけない、という決まりがあります。
今回の場合は Form1 を作成したスレッドと DOS_Exited メソッドが動作しているスレッドが別なため、
表示されている Form1 の Label1 にアクセスできていません。
コントロールを作成したスレッドからコントロールにアクセスするためには
Control.Invoke メソッドを使用します。
Control.Invoke メソッド (Delegate)
http://msdn2.microsoft.com/ja-jp/library/zyzhdc6b.aspx
次のようにすれば Label1 は非表示になると思います。
モジュールのコード-------
Private uiControl As Control
Public Sub コマンド実行の確認(c As Control)
uiControl = c
DOS_KILL = 0
Form3.GroupBox3.Visible = True
hProcess = System.Diagnostics.Process.Start((System.AppDomain.CurrentDomain.BaseDirectory) & "\CPU monitor\Batch folder\000.bat")
hProcess.EnableRaisingEvents = True
AddHandler hProcess.Exited, AddressOf DOS_Exited
End Sub
Private Sub DOS_Exited(ByVal sender As Object, ByVal e As System.EventArgs)
uiControl.Invoke(New MethodInvoker(AddressOf Invokeから呼ばれるメソッド))
End Sub
Private Sub Invokeから呼ばれるメソッド()
Form1.Label1.Visible = False
End Sub
-------
Invoke メソッドを使用するためのコントロールを
「コマンド実行の確認」関数の引数で受け取っています。
そのコントロールの Invoke メソッドから「Invokeから呼ばれるメソッド」関数を呼んでいます。
こうすることで「Invokeから呼ばれるメソッド」関数は
uiControl が作成されたコントロールのスレッドから呼び出すことができます。
もし、別スレッドでなければ My.Forms.Form1 で最初に表示されているフォームにアクセス可能です。
My.Forms を付けるか付けないかは関係ありません。
|
|