【发布时间】: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