gpt4 book ai didi

c# - 从多个线程更新多个 PictureBox

转载 作者:行者123 更新时间:2023-12-03 13:17:31 29 4
gpt4 key购买 nike

我在主窗体上有两个图片框,一个是来自安装在机器人顶部的网络摄像头的视频流,另一个是一些用户反馈,它不时更新,并带有它认为可以看到的图表(命名 map )。两张图片都可以由任何线程更新。如何安全地更新这些图片?

目前我的主窗体有两个方法,其中有一个委托(delegate)调用,如下所示:

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 ,但我没有完全理解它们,所以我不完全确定如何实现它们。

提前致谢。

最佳答案

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;
}
}

关于c# - 从多个线程更新多个 PictureBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22426430/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com