2017-05-30 13 views
0

我試圖在一個線程內創建一個循環,當它向我顯示文本框中的值時,繼續在我的表單中工作。 問題是,當它啓動時,我不能在窗體中做任何事情,例如按下按鈕或設置命令。vb.net如何在每個循環中顯示什麼線程正在計算並繼續在窗體中工作?

這裏是代碼的理念:

Imports System.Threading 

Public Class Form1 

    Dim trd As System.Threading.Thread 
    Dim cont As Integer 

    Private Sub btnOpen_Click(sender As Object, e As EventArgs) Handles btnOpen.Click 
      cont = 0 
      trd = New Thread(AddressOf trdReadAxis) 
      trd.Start() 
    End Sub 

    Private Delegate Sub CloseFormCallback() 
    Private Sub trdReadAxis() 
     While cont < 10 
      If InvokeRequired Then 
       Dim d As New CloseFormCallback(AddressOf trdReadAxis) 
       Invoke(d, Nothing) 
      Else 
       txtXPosition.Text = cont 
       cont += 1 
       Thread.Sleep(1000) 
      End If 
     end while 
    end class 

我能做些什麼,看everi第二的變化在我的文本框「txtXPosition」?

謝謝。

+0

使用'txtXPosition.Update()'或'txtXPosition.Refresh()'...的原因你的窗體和控件被鎖定是因爲你正在UI線程上執行代碼。 – Codexer

+0

我會推薦使用[BackgroundWorker](https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v = vs.110).aspx),因爲它很容易實現和預定義這樣的任務 –

回答

1

此代碼是一個爛攤子:

Private Sub trdReadAxis() 
    While cont < 10 
     If InvokeRequired Then 
      Dim d As New CloseFormCallback(AddressOf trdReadAxis) 
      Invoke(d, Nothing) 
     Else 
      txtXPosition.Text = cont 
      cont += 1 
      Thread.Sleep(1000) 
      End If 
    End while 
End Sub 

它看起來像你的工作線程通過Invoke,它會在UI線程上執行自我回調。一旦它在那裏,就會遍歷整個循環中的while循環 - 仍然在UI線程上 - 在循環的每次迭代中都會有Sleep(1000)。這將鎖定應該處理您的點擊和擊鍵的消息循環。

我建議你從一個更新的文本框,像這樣的代碼劃分出工作線程:

Delegate SetTextCallBack(ByVal message as string) 

Private Sub SetText(ByVal message as String) 
    if InvokedRequired then 
     Dim d As New SetTextCallback(AddressOf SetText) 
     Invoke(d, message) 
    Else 
     txtXPosition.Text = message 
    End If 
end sub 

Private Sub trdReadAxis() 
    While cont < 10 
     SetText cont 
     cont += 1 
     Thread.Sleep(1000) 
    End while 
End Sub 
+0

好的答案!雖然我只想指出'Dim a as Array(1)'是非常多餘的代碼。 [**'Control.Invoke()'**](https://msdn.microsoft.com/en-us/library/a1hetckb(v = vs.110).aspx)需要一個'ParamArray',以便您可以傳遞直接調用變量:'調用(d,message)' - _OR_至多可以做到這一點:'調用(d,New Object(){message})'。 –

+0

謝謝,編輯。通常不是VB的人:/ –

相關問題