2012-05-24 4 views
2

다음 테스트 코드가 있습니다. 그것은 아무것도 유용하지 않습니다,하지만 나 VB 이해하는 것이이있다 :InvokeRequired는 true가 예상 될 때 false를 계속 반환합니다.

Imports System 
Imports System.IO 
Imports System.Diagnostics 
Imports Microsoft.VisualBasic 
Imports System.Threading 

Public Class Sandbox 
    Public Shared num As NumericUpDown 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim objWrk As Worker 
     objWrk = New Worker 
     objWrk.Show() 
    End Sub 
End Class 

Public Class Worker 
    Public Sub Show() 
     Dim runThread As New System.Threading.Thread(AddressOf Run)  ' Call the runner in a seperate thread 
     runThread.Start() 
    End Sub 

    Public Sub Run() 
     runToggle(1000) 
    End Sub 

    Public Delegate Sub runToggleInvoker(ByVal value As Integer) 
    Public Sub runToggle(ByVal value As Integer) 
     If Sandbox.Label1.InvokeRequired = True Then 
      Sandbox.Label1.Invoke(New runToggleInvoker(AddressOf runToggle), value) 
     Else 
      Sandbox.Label1.Text = value 
     End If 
    End Sub 
End Class 

양식은 ButtonLabel로 구성되어 있습니다.

학습 목적으로 만 다른 스레드의 레이블에있는 텍스트를 변경하는 방법을 사용했습니다. 그러나 InvokeRequired 값은 False을 계속 반환합니다. 이것이 어떻게 가능한지? Label1은 주 스레드에서 만들어지고 runThread에서 조정되므로 InvokeRequired에 True를 지정해야합니다.

Public Sub Run() 
      Sandbox.Show() 
      runToggle(1000) 
     End Sub 

이 문제가 해결되지 않습니다

Here 나는 폼의 핸들이 아직 그렇게 만들어지지 않습니다 때 내 Run 방법을 변경 이런 것을 읽었다. 이 창 핸들을 가지고 컨트롤이나 폼을 찾을 때까지 컨트롤의 핸들이 아직 존재하지 않는 경우 Control.InvokeRequired Property

에 따르면

답변

3

, InvokeRequired는 컨트롤의 부모 체인을 검색합니다. 적절한 핸들을 찾을 수 없으면 InvokeRequired 메서드는 false을 반환합니다.

+0

좋아,하지만 먼저 'Sandbox.Show()'를 코딩하는 핸들을 만들려고했습니다. 이 핸들을 만들어야합니다. –

+1

이제 작업자 스레드 내부에서 Show를 호출하므로 호출이 필요하지 않습니다. 대신 주 스레드에서 양식을 표시하십시오. –

관련 문제