2016-10-29 4 views
0

스레딩 작업을 설명하기 위해 간단한 멀티 스레딩 프로그램을 만들고 있습니다. 나는 같은 시간에 세는 두 개의 카운터를 원하지만 작동하지 않습니다.멀티 스레딩이 작동하지 않습니다.

내가 사용하는 경우에만 작동합니다 : . 그러나 적절한 방법으로 프로그램하고 싶습니다.

코드 :

Dim Thread1 As System.Threading.Thread 
Dim Thread2 As System.Threading.Thread 

Private Delegate Sub SetTeller1() 

Private Sub teller1() 
    If teller1Label.InvokeRequired Then 
     Invoke(New SetTeller1(AddressOf teller1)) 
    Else 
     For i As Integer = 0 To 1000 
      teller1Label.Text = i 
      Refresh() 
     Next 
    End If 
End Sub 

Delegate Sub SetTeller2() 

Private Sub teller2() 
    If teller2Label.InvokeRequired Then 
     Invoke(New SetTeller2(AddressOf teller2)) 
    Else 
     For i As Integer = 0 To 1000 
      teller2Label.Text = i 
      Refresh() 
     Next 
    End If 
End Sub 

Private Sub teller1Button_Click(sender As Object, e As EventArgs) Handles teller1Button.Click 
    Thread1 = New Threading.Thread(AddressOf teller1) 
    Thread1.Start() 
End Sub 

Private Sub teller2Button_Click(sender As Object, e As EventArgs) Handles teller2Button.Click 
    Thread2 = New Threading.Thread(AddressOf teller2) 
    Thread2.Start() 
End Sub 

답변

1

멀티 스레딩은 완벽하게 작동하지만, 당신은 그것을 사용하지 않습니다. 백그라운드 스레드에서 현재 수행중인 유일한 작업은 Invoke입니다. 즉, 스레드가 몇 밀리 초 내에 종료 된 다음 버려집니다.

Invoke을 호출하면 teller1 또는 teller2 메서드 실행이 UI 스레드로 이동합니다. 즉, 실행이 완료 될 때까지 UI가 차단됩니다. UI을 업데이트 할 때만 을 호출하고 백그라운드 스레드에서 모든 반복을 수행해야합니다.

Delegate Sub SetTeller1(ByVal Text As String) 

Private Sub teller1() 
    For i As Integer = 0 To 1000 
     SetTeller1Text(i) 
    Next 
End Sub 

Private Sub SetTeller1Text(ByVal Text As String) 
    If Me.InvokeRequired Then 
     Me.Invoke(New SetTeller1(AddressOf SetTeller1Text), Text) 
    Else 
     teller1Label.Text = Text 
     Me.Refresh() 
    End If 
End Sub 

내가 Me.Invoke(...)에 예를 Invoke(...)에 대해 변경 가독성을 높이기 위해 :

다음은 더 제대로 할 수있는 방법의 예입니다.

또한 내가 왜 Refresh()을 호출 할 필요가 없으며 전체 컨테이너를 추가로 다시 그려야 할 것인지는 잘 모르겠다.

관련 문제