我正在编写一个GUI,显示从相机不断获取的视频。我还为负责获取帧的相机开发了一个'dll'。每次获取帧时,它都会生成一个事件。
当主表单加载时,它会注册到该事件:
testCameraHandle = new CCameraHandle();
testCameraHandle.NewFrameAdded += testCameraHandle_NewFrameAdded;
通过这种方式,每次获取帧时,GUI都可以更新其图片框:
delegate void NewFrameAddedDelegate(object sender, EventArgs e);
private void testCameraHandle_NewFrameAdded(object sender, EventArgs e)
{
//"pbImage" is the name of the picturebox
if (pbImage.InvokeRequired)
{
NewFrameAddedDelegate del = new NewFrameAddedDelegate(testCameraHandle_NewFrameAdded);
pbImage.Invoke(del, sender, e);
}
else
{
var oldImage = pbImage.Image;
pbImage.Image = testCameraHandle.bitmap;
if (oldImage != null)
((IDisposable)oldImage).Dispose();
}
}
在这个GUI的主要形式中,我还有一个Windows.Forms.Timer
,它每5个刻度运行一次,需要100ms来完成它的循环。这个计时器对我来说是必要的,我不能删除或移动到其他地方。这种结构并不令人满意,因为即使相机以每秒20帧的速度运行,“图片盒”的更新速度也很慢而且不稳定。我无法弄清楚所有这些工作的方式和与相机fps同步的“刷新率”。有这个问题的解决方案吗?或者,自定时器运行以来,不可能具有良好的“刷新率”?非常感谢你!
编辑:
我正在尝试使用System.Threading.Timer
,但每次相机开始抓取时,计时器都会停止循环。我正在这样初始化计时器:
System.Threading.TimerCallback timerCallback = this.timerPLC_Tick;
System.Threading.Timer thTimer = new System.Threading.Timer(timerPLC_Tick, null, 1000, 5000);