非同期別スレッドからForm.Controlを操作する方法

解決


まさお  2013-05-23 21:12:31  No: 148156

まさお と申します。  宜しくお願い致します。

  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

以上、宜しくお願い致します。


shu  2013-05-24 01:04:46  No: 148157

該当箇所を

Me.Invoke(Sub()
              Me.Button1.Enabled = True
              Me.Button3.Enabled = True '※α Button3_Clickで System.InvalidOperationException 発生
          End Sub)

のようにInvokeで実行するようにするとよいです。


まさお  2013-05-24 18:29:59  No: 148158

shu さん、ありがとうございました。

  できました。

  解決したのですが、それ以上に大きな疑問を持っています。
    Me.Invoke(Sub()  …  End Sub)
  解決策があまりにあっけないのでショックです。
  この問題と取り組んで私は自分なりに色々と試行錯誤していました。
  しかしこのような構文を自分で思いつくことはできません。

  先輩諸兄は何故このような事を知っていらっしゃるのでしょうか?
  どうやってこのような知識を得られているのでしょうか?
  MSDNをとことん読み込めば身に付くのでしょうか?
  所詮私のような若輩者はこのような掲示板で質問し、部分的に解決策を身に付けるしかないのでしょうか?
  以上愚痴でした。(^^;

  ありがとうございました。
  解決しました。
  暫くしたら閉じます。


まさお  2013-05-25 00:56:43  No: 148159

閉じます
shu さん、ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加