2012-02-17 51 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)

相关问题