VB.NET(2005)で質問します。
Form1に、Label1を貼付けています。
Button1押下で、スレッドを起動し、Label1の表示を変えることは出来ました。
(以下のコード参照してください。)
スレッドはForm1と同一のクラスに存在しますが、別クラスのスレッドを呼び出して
Label1の表示を変える方法を、どなたかご教授下さい。
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim t As New System.Threading.Thread(AddressOf worker)
t.Start()
End Sub
Sub setLabel()
Label1.Text = テストラベル表示が来たよ
End Sub
Delegate Sub SetLabelDelegate()
Public Sub worker()
Invoke(New SetLabelDelegate(AddressOf setLabel))
End Sub
End Class
>スレッドはForm1と同一のクラスに存在しますが、別クラスのスレッドを呼び出して
>Label1の表示を変える方法を、どなたかご教授下さい。
ここら辺が、ちょっと理解できないっぽい。
別クラスなのか同一クラスなのかどちらでしょうか?
Form1
├Label1
│ ↑変更
└Thread1
はできたけど、
Form1
└Label1
↑
Class1 ↑変更
│ ↑
└Thread1
ができないということ?
そもそもClass1とForm1の関連していないと変更はできないでしょうね。
説明不足でした。 ご指摘の通りです。
Form1
├Label1
│ ↑変更
└Thread1
はできました。
Form1
└Label1
↑
Class1 ↑変更
│ ↑
└Thread1
ができません。
>そもそもClass1とForm1の関連していないと変更はできないでしょうね。
Class1をForm1から継承させてみたりしたのですが、うまくいきません。
Class1とForm1の最適な関連方法は、どの様にすべきでしょうか?
基本的質問になるかもしれませんが、宜しくお願いします。
継承とか関係ないです。
どうやってClass1のメソッドを呼ぼうとしているのかが知りたいのですけど。
ボタンのクリックで Class1 を New してメソッドかなんかでスレッドをスタートさせる
とか。
時計のような例です。(見易さのため改行を入れてあります)
◎Form1内
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Dim c As New MyClock()
' ラベルに表示させるデリゲードを割り付ける
c.Display = New MyClock.DisplayDelegate(AddressOf SetLabel)
c.Start()
End Sub
Private Delegate Sub SetLabelDelegate(ByVal text As String)
Private Sub SetLabel(ByVal text As String)
' 別スレッドから呼び出されているか
If InvokeRequired Then
Invoke(New SetLabelDelegate(AddressOf Set_Label), _
New Object(){text})
Return
End If
Set_Label(text)
End Sub
Private Sub Set_Label(ByVal text As String)
Label1.Text = text
End Sub
◎Class1(全て)
Public Class MyClock
Public Delegate Sub DisplayDelegate(ByVal text As String)
Public Display As DisplayDelegate = Nothing
Public Sub Start()
Dim t As New Thread(New ThreadStart(AddressOf worker))
t.Start()
End Sub
Private Sub worker()
Do
If Not Me.Display Is Nothing Then
' 現在時刻を表示
Display(DateTime.Now.ToString(HH:mm:ss))
End If
Thread.Sleep(1000)
Loop
End Sub
End Class
訂正)
>◎Class1(全て)
Class1ではなくMyClockという名前にしてありました。
全部置き換えてかんがえてみてください。
Blue 様
回答、誠にありがとうございます。
上記プログラムは私が求めていたもの、そのものでした。
Delegate、Invoke の関係がいまひとつ理解不足でした。
ご教授いただいたソ-スで解析(勉強)したいと思います。
ありがとうございました。