我在主表单上有两个图片框,一个是安装在机器人顶部的网络摄像头的视频流,另一个是一些用户反馈,每隔一段时间就会更新一次,并附有一个图片。它可以看到(命名地图)。两张图片都可以由任何线程更新。如何安全地更新这些图片?
目前,我的主表单有两个方法,其中有一个委托调用,如下所示:
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,但我完全不了解它们,所以我不完全确定如何实现它们。
提前致谢。
答案 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;
}
}