2012-02-17 27 views
0

任何人都可以在這裏幫助我。我對VB.net和線程相當新,所以我只是想弄清楚發生了什麼。vb.net線程進度條 - 線程操作無效:從其創建的線程以外的線程訪問的控制'ProgressBar1'

當我調試這個我收到錯誤

線程操作無效:控制「ProgressBar1」從比它創建的線程以外的 線程訪問。

我有點失落,爲什麼錯誤發生或如何解決它。我必須將進度條放入單獨的線程,否則GUI崩潰

Private Sub InstallTheAgent_Click(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles InstallTheAgent.Click 
    MsgBox("Click OK to continue to install the Agent") 
    Dim t As Thread 

    t = New Threading.Thread(AddressOf WorkInstallAgent) 
    t.Start() 
End Sub 

Private Sub WorkInstallAgent() 
    ProgressBarThread() 
    Dim DeviceLines As String() = IO.File.ReadAllLines(DynPath & "\machines.txt") 
    ProgressBar1.Minimum = 0 
    ProgressBar1.Maximum = DeviceLines.Length 

    Using myReader As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(DynPath & "\machines.txt") 
     ProgressBarThread() 
     Do While myReader.Peek() >= 0 

      Dim computerName As String = myReader.ReadLine 
      If My.Computer.Network.Ping(computerName) = True Then 
       Call CopyAgent(computerName) 
       Call InstallAgent(computerName) 
       Call Agent(computerName) 
       Call RemoveTempSoftware(computerName) 
      End If 
      ProgressBar1.Value = ProgressBar1.Value + 1 
     Loop 
    End Using 

    MsgBox("Installation of the Agent Complete") 
    ProgressBar1.Value = 0 


End Sub 

Public Sub ProgressBar() 

    If Me.InvokeRequired Then 
     Me.Invoke(New MethodInvoker(AddressOf ProgressBar)) 
    Else 
     Dim DeviceLines As String() = IO.File.ReadAllLines(DynPath & "\machines.txt") 
     ProgressBar1.Minimum = 0 

     ProgressBar1.Maximum = DeviceLines.Length 
    End If 
End Sub 

Public Sub ProgressBarThread() 
    Dim p As Thread 

    p = New Threading.Thread(AddressOf ProgressBar) 
    p.Start() 

End Sub 

回答

0

進度條在GUI線程上。如果您嘗試從其他線程訪問它,則會發生此錯誤。

嘗試使用後臺工作者。檢查這個鏈接: http://www.java2s.com/Code/VB/GUI/BackgroundWorkerDemo.htm

+0

謝謝,但是我的程序中有大約15個其他選項已經爲線程設置,因此切換到後臺工作人員是不可行的 – K20GH 2012-02-17 10:31:23

0

對不起,但你的代碼是混亂的。您可以在所有此代碼中混合使用數據處理和進度顯示。 你調用一個線程(ProgressBarThread),它會調用一個可能會自動調用的子...做一個操作?那麼爲什麼一個線程?
並且由於只有一個進度條,因此無法啓動多個線程並顯示其中的每個線程。

  1. 對每個線程狀態對象(最小值,最大值,電流特性,使得使用NotifyPropertyChanged,也許標題,參考THEAD註銷的...。)
  2. 在新線程的創建;你給線程一個狀態對象,你將這個狀態對象添加到一個可觀察的狀態集合中,該狀態綁定到一個具有進度條作爲項目樣式的列表框。
  3. 然後你只需要更新你的主進程線程的狀態,它就可以工作。 (無需進度潛艇)

或者......快速和骯髒的解決辦法:每次使用調用訪問您的進度:Me.Invoke(子()ProgressBar1.Minimum = 12)

相關問題