2014-10-27 158 views
-1

我正在在.NET 4.0 WinForms應用程序(vb.net),我想問一下:多線程及的Thread.Sleep凍結GUI

我寫一段代碼,需要運行的每個特定的時間間隔。該任務將首先禁用表單中的按鈕,然後完成工作。在這項工作中的兩點,它必須等待1秒,然後繼續。完成後,它必須重新啓用該按鈕。

在整個過程中,我不想凍結gui。

我應該如何實施?我必須使用後臺工作者嗎?

隨意回答我在c#或vb.net,無論你喜歡!

提前致謝!

編輯:我到目前爲止已經做了(我用Aforge.NET框架捕捉攝像頭截圖):

我在形式拖着backgroung工人。在其DoWork的情況下,我進入主作品名稱:

Private Sub BackgroundWorker_camera_DoWork() Handles BackgroundWorker_camera.DoWork 

     do_evaluation() 

    End Sub 

的do_evaluation子必須做一些工作,然後等待第二個(攝像機設備做好準備),捕捉攝像頭快照,再等待第二和完成工作:

Public Delegate Sub do_evaluationDelegate() 
    Public Sub do_evaluation() 
     If Me.InvokeRequired Then 
     Me.Invoke(New do_evaluationDelegate(AddressOf do_evaluation)) 
     Return 
    End If 


    ButtonX_Evaluate.Enabled = False 
    ButtonX_restore.Enabled = False 


    ...some work... 

    evaluate_from_camera() 

    ...some work... 

    Main.ButtonX_Evaluate.Enabled = True 
    Main.ButtonX_restore.Enabled = True 

    ReleaseMemory() 

End Sub 

而且從相機子評價:

Public Delegate Sub evaluate_from_cameraDelegate() 
    Public Sub evaluate_from_camera() 
     If Me.InvokeRequired Then 
      Me.Invoke(New evaluate_from_cameraDelegate(AddressOf evaluate_from_camera)) 
      Return 
     End If 

        Aforge_cam.start_source() 



        'wait for 1sec 
        Thread.Sleep(1000) 


        AddHandler Aforge_cam.videoSource.NewFrame, AddressOf Aforge_cam.video_NewFrame 

        'wait for 1sec 
        Thread.Sleep(1000) 

        Aforge_cam.CloseVideoSource() 


    End Sub 

由於系統需要一點時間來連接到硬件凸輪,子必須等待SE在Aforge_cam.start_source()命令之後的cond,以便硬件完全初始化。

然後,在evaluate _from_camera中添加新幀捕獲事件的處理程序將導致在公共變量「屏幕截圖」中捕獲新幀。由於它需要十分之幾秒從網絡攝像頭捕捉幀,因此代碼必須等待捕捉截圖變量中的位圖才能繼續。因此2個睡眠命令。

我開始使用RunWorkerAsync命令給後臺工作進程。 儘管如此,GUI凍結,我不明白爲什麼,因爲後臺工作人員在一個單獨的線程上運行,對不對?

+2

告訴我們你到目前爲止所嘗試過的。由於缺乏您的信息,很難回答。一個後臺工作人員會工作,一個新的線程也會工作,但兩者都不同,具體取決於你想要什麼... – Codexer 2014-10-27 12:42:05

回答

0

您需要使用Timer來定時您的操作,在UI上使用Thread.Sleep線程會凍結GUI並且不適用於此類任務。

只是choose the one最適合你。