tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルInvokeRequiredプロパティの適用範囲について
記事No11663
投稿日: 2016/05/16(Mon) 11:52
投稿者OrientalMelody
いつもお世話になっております。

.Netのスレッド処理を最近使い始めたものですが、
InvokeRequiredプロパティの事実上の適用範囲について悩んでいます。

サンプルとして以下のようなプロジェクトを作成します。

(1)新規プロジェクトを立ち上げ、FormオブジェクトとしてForm1、ClassオブジェクトとしてClass1ファイルを追加します。

(2)Form1ファイルにButtonコントロールとして、Button1,
  TextBoxコントロールとして、Text1, Text2を貼り付けます。
  
(3)Class1.vbファイルに以下のコードを貼り付けます。

Public Class Class1
    'フォームの参照を保持する
    Private _Form1 As Form1
    Delegate Sub AddTextCallback(ByVal text1 As String, ByVal text2 As String, ByVal frm As Form1)

    'コンストラクタ
    Public Sub New(ByVal frm As Form)
        _Form1 = CType(frm, Form1)
    End Sub

    '複数のテキストボックスに値を設定する
    Public Sub Form1TextBoxSetText(ByVal sVal1 As String, ByVal sVal2 Aas String, ByVal frm As Form1)

        If frm.TextBox1.InvokeRequired Then

            Dim d As New AddTextCallback(AddressOf Form1TextBoxSetText)
            frm.Invoke(d, New Object() {sVal1, sVal2, frm})
        Else
            frm.TextBox1.Text = sVal1
            frm.TextBox2.Text = sVal2
        End If
    End Sub
End Class

(4)Form1.vbファイルに以下のコードを貼り付けます。

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf ThreadA))
        Thread1.IsBackground = True
        Thread1.Start()
    End Sub

    Private Sub ThreadA()
        Dim oClass1 As New Class1(Me)
        oClass1.Form1TextBoxSetText("TestA", "TestB", Me)
    End Sub

End Class



このときの Class1.Form1TextBoxSetTextプロシージャですが、
別スレッドかどうかを
If frm.TextBox1.InvokeRequired Then
のみで判断しています。

frm.TextBox1.InvokeRequired

frm.TextBox2.InvokeRequired
は事実上常に同じと考えても良いのでしょうか?

実際、上記のソースは問題なく動きます。

本当は業務画面には大量のコントロールがあるので、コントロール毎にプロシージャを
作りたくないのが今回の趣旨です(^^ゞ

もし何かお分かりの方がいらっしゃいましたら、
ご教示のほどよろしくお願いいたします。

[ツリー表示へ]
タイトルRe: InvokeRequiredプロパティの適用範囲について
記事No11664
投稿日: 2016/05/16(Mon) 13:20
投稿者Hongliang
そのスレッドに属するControl派生のオブジェクトであればどれでも問題ありません。
同じForm上に存在するコントロール類(Form自身を含めて)は確実に全て同じスレッドに属すると考えられるので、その中から自由に選べばいいでしょう。

ちなみに、そのコントロールが属するスレッドというのは、そのコントロール(厳密にはウィンドウハンドル)を作成したスレッドのことになります。

[ツリー表示へ]
タイトルRe^2: InvokeRequiredプロパティの適用範囲について
記事No11665
投稿日: 2016/05/16(Mon) 13:28
投稿者OrientalMelody
Hongliang様

迅速かつ丁寧なご回答、大変ありがとうございます。

同じForm上に存在するコントロール類(Form自身を含めて)は確実に全て同じスレッドに属すると考えられるのですね。

スレッド処理関係はまだ始めたばかりですので、これから勉強して精進していきたいと思います。

ありがとうございました。

[ツリー表示へ]