まさお と申します。 宜しくお願い致します。
WinXP Pro SP3,VB2010 Express SP1 です。
vb.netに関わる或るWebページ http://codezine.jp/article/detail/139 を参考に下記を作成しました。
基本的には動いているのですが、非同期別スレッドからフォームコントロールを操作する方法が判りません。
※β部(だけではないかもしれませんが)をどのようにすれば良いか教えて戴きたくお願い致します。
Public Class Form1
Private Delegate Sub dlgSleep(ByVal flgOperateControl As Boolean)
Private dlg As New dlgSleep(AddressOf Sleeping)
Private flgExecuting As Boolean = False
'別スレッド
Private Sub Sleeping(ByVal flgOperateControl As Boolean)
flgExecuting = True
System.Threading.Thread.Sleep(5000) '5秒Sleep
If flgOperateControl Then
Me.Button1.Enabled = True
Me.Button3.Enabled = True '※α Button3_Clickで System.InvalidOperationException 発生
End If
flgExecuting = False
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
'同期スレッド Button4_Clickしても直ぐにはMsgBoxは表示されない。Form.Controlの操作は可能
Button1.Enabled = False
Call Me.BeginInvoke(dlg, New Object() {True})
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
'非同期スレッド Button4_Clickで直ちにMsgBoxが表示される。
Call dlg.BeginInvoke(False, Nothing, Nothing)
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
'非同期スレッド Button4_Clickで直ちにMsgBoxが表示されるがForm.Controlの操作は不可
'※αで System.InvalidOperationException が発生する
Button3.Enabled = False
Call dlg.BeginInvoke(True, Nothing, Nothing) '※β
End Sub
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
Dim sMsg As String = If(flgExecuting, "実行中", "待機中")
MsgBox(sMsg)
End Sub
End Class
以上、宜しくお願い致します。
該当箇所を
Me.Invoke(Sub()
Me.Button1.Enabled = True
Me.Button3.Enabled = True '※α Button3_Clickで System.InvalidOperationException 発生
End Sub)
のようにInvokeで実行するようにするとよいです。
shu さん、ありがとうございました。
できました。
解決したのですが、それ以上に大きな疑問を持っています。
Me.Invoke(Sub() … End Sub)
解決策があまりにあっけないのでショックです。
この問題と取り組んで私は自分なりに色々と試行錯誤していました。
しかしこのような構文を自分で思いつくことはできません。
先輩諸兄は何故このような事を知っていらっしゃるのでしょうか?
どうやってこのような知識を得られているのでしょうか?
MSDNをとことん読み込めば身に付くのでしょうか?
所詮私のような若輩者はこのような掲示板で質問し、部分的に解決策を身に付けるしかないのでしょうか?
以上愚痴でした。(^^;
ありがとうございました。
解決しました。
暫くしたら閉じます。
閉じます
shu さん、ありがとうございました。