从多个线程更新多个PictureBox

时间:2014-03-15 16:23:19

标签: c# multithreading user-interface thread-safety picturebox

我在主表单上有两个图片框,一个是安装在机器人顶部的网络摄像头的视频流,另一个是一些用户反馈,每隔一段时间就会更新一次,并附有一个图片。它可以看到(命名地图)。两张图片都可以由任何线程更新。如何安全地更新这些图片?

目前,我的主表单有两个方法,其中有一个委托调用,如下所示:

public partial class MainForm : Form
{

public void videoImage(Image image)
{
    this.VideoViewer.Image = image;
    if (this.InvokeRequired)
    {
        this.Invoke(new MethodInvoker(delegate { videoImage(image); }));
     }
}

public void mapImage(Image image)
{
    this.VideoViewer.Image = image;
    if (this.InvokeRequired)
    {
        this.Invoke(new MethodInvoker(delegate { mapImage(image); }));
    }
}

}

主机器人线程中有这个:

public delegate void videoImageReady(System.Drawing.Image image);
public event videoImageReady videoImage;

并且第三个帖子有

public delegate void mapImageReady(System.Drawing.Image image);
public event mapImageReady mapImage;

我不确定这是否是正确的方法,或者如果有更好的方法,这就是我发现的方式(但它不起作用)我找到了这个example这个example,但我完全不了解它们,所以我不完全确定如何实现它们。

提前致谢。

2 个答案:

答案 0 :(得分:2)

应该是:

if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(delegate { videoImage(image); }));
return;
}

否则你将调用MethodInvoker委托,然后调用正常委托。

答案 1 :(得分:1)

InvokeRequired检查及其处理是为了确保UI控件在UI线程上更新,而不是从您自己的线程更新。您的代码会查找所有位,但代码的顺序错误。我举了一个例子:

// this is called from any thread
public void videoImage(Image image)
{
    // are we called from the UI thread?
    if (this.InvokeRequired)
    {
        // no, so call this method again but this
        // time use the UI thread!
        // the heavy-lifting for switching to the ui-thread
        // is done for you
        this.Invoke(new MethodInvoker(delegate { videoImage(image); }));
    } 
    else 
    {
        // we are now for sure on the UI thread
        // so update the image
        this.VideoViewer.Image = image;
    }
}