多线程& thread.sleep冻结了gui

时间:2014-10-27 12:39:39

标签: c# vb.net multithreading user-interface freeze

我正在.net 4.0(vb.net)制作一个WinForms应用程序,我想问一下:

我正在编写一段需要运行每个特定时间间隔的代码。此任务将首先禁用表单中的按钮,然后执行工作。在此工作期间的2点,它必须等待1秒然后继续。完成后,必须重新启用该按钮。

在整个程序中,我不想冻结gui。

我应该如何实现这个目标?我必须使用后台工作人员吗?

随时随地用c#或vb.net回答我,无论你喜欢什么!

提前致谢!

编辑:到目前为止我所做的工作(我正在使用Aforge.NET框架捕获相机屏幕截图):

我在表格中拖了一个背景工作者。在DoWork活动中,我输入了主要作品的名称:

Private Sub BackgroundWorker_camera_DoWork() Handles BackgroundWorker_camera.DoWork

        do_evaluation()

    End Sub

do_evaluation sub必须做一些工作,然后等待一秒钟(让相机设备准备就绪),捕捉相机快照,等待一秒钟并完成工作:

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

由于系统需要一点时间连接到硬件凸轮,因此sub必须在Aforge_cam.start_source()命令后等待一秒钟,以便硬件完全初始化。

然后,在evaluate _from_camera中添加新帧捕获事件的处理程序将导致在公共变量" screenshot"中捕获新帧。由于需要几十分之一秒才能从网络摄像头捕获帧,因此代码必须等待捕获屏幕截图变量中的位图才能继续。因此,2个睡眠命令。

我使用RunWorkerAsync命令向后台工作者开始此过程。 然而,GUI冻结了,我无法理解为什么,因为后台工作者在一个单独的线程上运行,对吗?

1 个答案:

答案 0 :(得分:0)

您需要使用Timer来为您的操作计时,在UI线程上使用Thread.Sleep将冻结GUI,而不是用于此类任务。

只适合你的choose the one