【问题标题】:Multithreading & thread.sleep freezes gui多线程和 thread.sleep 冻​​结 gui
【发布时间】:2014-12-22 15:28:57
【问题描述】:

我正在.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 子程序必须做一些工作,然后等待一秒钟(让相机设备准备好),捕获相机快照,再等待一秒钟并完成工作:

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

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

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

我以RunWorkerAsync 对后台工作人员的命令开始该过程。 然而,GUI 冻结了,我不明白为什么,因为后台工作人员在单独的线程上运行,对吧?

【问题讨论】:

  • 向我们展示您迄今为止所做的尝试。由于缺乏您提供的信息,很难回答。后台工作人员可以工作,新线程也可以工作,但两者都不同,具体取决于您想要什么......

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


【解决方案1】:

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

只要choose the one 最适合你。

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2012-05-12
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多