C#Picturebox更新问题

时间:2015-10-14 14:38:52

标签: c# multithreading camera

我正在编写一个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);

0 个答案:

没有答案