2017-06-28 12 views
0

私は2つのフォームを持つプロジェクトを持っています。 Form1とform2。 Form1のコードについてはVB.NETの他のフォームでスレッドのlabel.textを変更する方法

は次のとおりです。Form2ので

Public Class Form1 
Dim thread As System.Threading.Thread 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Form2.Show() 
End Sub 

Private Sub countup(ByVal startFrom As Integer) 
    For startFrom = startFrom To startFrom + 10000 
     startFrom += 1 
     Form2.Label1.Text = startFrom 
    Next 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    thread = New System.Threading.Thread(AddressOf countup) 
    thread.Start(1000) 
End Sub 

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 
    thread.Abort() 
End Sub 
End Class 

私はLABEL1という名前のラベルのみ。 私はForm1で開始されたスレッドからForm2のlabel1.textを更新する必要があります。 プログラムはエラーなく実行されますが、何も起こりません。 form2のLabel1.textは変更されません。 これを行う方法は?事前に おかげ

+1

[** Control.Invoke()**を使用して、スレッドセーフな呼び出しを実行する](https://stackoverflow.com/documentation/vb.net/1913/threading/6235/perform-thread-safe-calls-using-control-invoke#t = 201706240759182674836) - この場合、Me.Invoke()および_ ** not ** _' Form2.Label1を呼び出す必要があります.Invoke() 'これは、フォームのデフォルトインスタンスにアクセスすると、現在のスレッド(この場合は実際のUIスレッドではなくバックグラウンドスレッド)で作成された新しいインスタンスにアクセスするためです。 –

+0

申し訳ありませんが、わかりません。 Label1はForm1にはなく、Form2には... – SomeOneMore

+0

UIスレッド内にある限り、どこにコントロールを呼び出すかは関係ありません。私のリンクをチェックし、 'LogTextBox.Invoke'の代わりに' Me.Invoke'を書いてください( 'LogTextBox.InvokeRequired'と同じです)。残りの情報はリンクにありますが、ご質問がありましたらお気軽にお問い合わせください。 –

答えて

0

ソリューション:

Invoke(Sub() 
      Form2.Label1.Text = startFrom 
     End Sub) 
+0

ニース!しかし、あなたは 'InvokeRequired'もチェックするべきです。 'False'を返すと、余分なオーバーヘッドが加わるため、呼び出す必要はありません。 –

+0

invokeRequiredはfalseですが、エラーはありませんが、私がinvokeを呼び出さないとうまくいかない:-s – SomeOneMore

+1

'InvokeRequired'は、フォームが表示されハンドルが作成される前に' False'を返します。 - 'Me.InvokeRequired'(または' InvokeRequired')とForm2.Label1.InvokeRequired(Form2.Label1.Invoke()を呼ばないでください)をチェックしてください。 ')。 –

関連する問題