2010-02-10 98 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