2010-02-10 57 views
0

我有一个cmd命令需要执行,当命令启动时它开始填充进度条。当cmd命令完成时,进度条需要填充100个。VB.net跨线程

这是我使用的代码,但当progressbar.Value = 100出现时它给了我一个错误。

Public Class Form1 
    Dim teller As Integer 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerProgressbar.Tick 
    teller += 1 
    ProgressBar1.Value = teller 

    If ProgressBar1.Value = ProgressBar1.Maximum Then 
     TimerProgressbar.Stop() 
    End If 
End Sub 

这是另一个私人小组拖命令在应用程序上

ProgressBar1.Value = 100 
    TimerProgressbar.Stop() 

崩溃当我调试它,我尝试一下它崩溃的

ProgressBar1.Value = 100 

但是,当我建立它在Windows 7下运行良好,但没有崩溃,但有一些人告诉我它在Windows XP系统崩溃。

VB给了我一个关于跨线程的建议,但我不知道如何使它能够与它一起工作。

+1

没有什么是“横线” - Windows.Forms.Timer的Tick事件是在UI线程上。你实际收到的错误是什么? – 2010-02-10 20:45:51

+0

忘带了什么东西,我开始按钮进度条 ProgressBar1.Value = 100 TimerProgressbar.Stop() 林确实得到IllegalOperationException错误之外。带有一个到十字线页面的链接。 Private Sub Button_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button.Click TimerProgressbar.Start() End Sub – PandaNL 2010-02-12 23:55:36

+0

btw it IllegalOperationException – PandaNL 2010-02-13 00:25:20

回答

0

您只能从创建该窗口的线程访问(有一个例外)Window(或任何与Window绑定的)属性和方法。

但WinForms包含对Invoke(和BeginInvoke)方法与InvokeRequired属性执行跨线程调用的支持。

如果InvokeRequired为真,那么您需要使用Invoke来跨线程。为此,请使用自己的方法来处理控制的代码,并直接调用或通过Invoke进行调用。 (要执行的操作的横线程异步使用BeginInvoke代替。)喜欢的东西:你正在展示

Private Sub IncrementProgress() 
    teller += 1 
    ProgressBar1.Value = teller 

    If ProgressBar1.Value = ProgressBar1.Maximum Then 
     TimerProgressbar.Stop() 
    End If 
End Sub  

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerProgressbar.Tick 
    if ProgressBar1.RequiredInvoke Then 
    ProgressBar1.Invoke(IncrementProgress) 
    Else 
    IncrementProgress 
    End If 
End Sub