他クラスのスレッドからのフォーム制御 – プログラミング – Home

他クラスのスレッドからのフォーム制御
 
通知
すべてクリア

[解決済] 他クラスのスレッドからのフォーム制御


ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 18
Topic starter  

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


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>スレッドはForm1と同一のクラスに存在しますが、別クラスのスレッドを呼び出して
>Label1の表示を変える方法を、どなたかご教授下さい。
ここら辺が、ちょっと理解できないっぽい。

別クラスなのか同一クラスなのかどちらでしょうか?

Form1
├Label1
│ ↑変更
└Thread1

はできたけど、

Form1
└Label1

Class1 ↑変更
│ ↑
└Thread1

ができないということ?
そもそもClass1とForm1の関連していないと変更はできないでしょうね。


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 18
Topic starter  

説明不足でした。 ご指摘の通りです。

Form1
├Label1
│ ↑変更
└Thread1

はできました。

Form1
└Label1

Class1 ↑変更
│ ↑
└Thread1
ができません。

>そもそもClass1とForm1の関連していないと変更はできないでしょうね。
Class1をForm1から継承させてみたりしたのですが、うまくいきません。
Class1とForm1の最適な関連方法は、どの様にすべきでしょうか?
基本的質問になるかもしれませんが、宜しくお願いします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

継承とか関係ないです。
どうやって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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

訂正)
>◎Class1(全て)
Class1ではなくMyClockという名前にしてありました。
全部置き換えてかんがえてみてください。


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 23年前
投稿: 18
Topic starter  

Blue 様

回答、誠にありがとうございます。
上記プログラムは私が求めていたもの、そのものでした。
Delegate、Invoke の関係がいまひとつ理解不足でした。
ご教授いただいたソ-スで解析(勉強)したいと思います。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました