Invoke
问题描述:实时取像时(这里用的是MvCamCtrl.Net.dll)对图像进行算法操作,主页面需要更新图里处理后得到的坐标值,此时取像函数是通过新的线程执行,那么如何在取像的线程中跨进程访问控件,并且修改其属性值?
如图:案例中修改了两个textbox的值属性
![在这里插入图片描述](https://img-blog.csdnimg.cn/d6c44a7e10d848d89b358b46b295fd78.jpeg#pic_center)
代码描述,创建一个委托set_value(), 这里的x和y都是全局变量,result_.X和result_.Y是Alg算法类内的静态变量存储了坐标点的x,y值,set_textb_x_value() 与set_textb_y_value() 是赋值函数,f()主要是调用Invoke方法,相当于派一个人(set_value())帮忙完成一件赋值的事情(set_textb_x_value(), set_textb_y_value() )。取像的代码源于安装海康威视软件后,其提供的example(C:\Program Files (x86)\MVS\Development\Samples\C#\MvCamCtrlNet)。
private delegate void set_value();
private void set_textb_x_value()
{
x = Alg.result_.X.ToString();
TxtB_x.Text = x;
}
private void set_textb_y_value()
{
y = Alg.result_.Y.ToString();
TxtB_y.Text = y;
}
private void f()
{
Image<Bgr, byte> img = alg.Find_(brm.ToImage<Bgr, byte>());
Pic2.Image = img.ToBitmap();
this.Invoke(new set_value(set_textb_x_value));
this.Invoke(new set_value(set_textb_y_value));
}
public void ReceiveThreadProcess()
{
public void ReceiveThreadProcess()
{
CFrameout pcFrameInfo = new CFrameout();
CDisplayFrameInfo pcDisplayInfo = new CDisplayFrameInfo();
CPixelConvertParam pcConvertParam = new CPixelConvertParam();
int nRet = CErrorDefine.MV_OK;
while (m_bGrabbing)
{
nRet = cc.m_MyCamera.GetImageBuffer(ref pcFrameInfo, 1000);
if (nRet == CErrorDefine.MV_OK)
{
lock (BufForDriverLock)
{
m_pcImgForDriver = pcFrameInfo.Image.Clone() as CImage;
m_pcImgSpecInfo = pcFrameInfo.FrameSpec;
pcConvertParam.InImage = pcFrameInfo.Image;
if (PixelFormat.Format8bppIndexed == m_pcBitmap.PixelFormat)
{
pcConvertParam.OutImage.PixelType = MvGvspPixelType.PixelType_Gvsp_Mono8;
cc.m_MyCamera.ConvertPixelType(ref pcConvertParam);
}
else
{
pcConvertParam.OutImage.PixelType = MvGvspPixelType.PixelType_Gvsp_BGR8_Packed;
cc.m_MyCamera.ConvertPixelType(ref pcConvertParam);
}
m_pcBitmapData = m_pcBitmap.LockBits(new Rectangle(0, 0, pcConvertParam.InImage.Width, pcConvertParam.InImage.Height), ImageLockMode.ReadWrite, m_pcBitmap.PixelFormat);
Marshal.Copy(pcConvertParam.OutImage.ImageData, 0, m_pcBitmapData.Scan0, (Int32)pcConvertParam.OutImage.ImageData.Length);
m_pcBitmap.UnlockBits(m_pcBitmapData);
brm = (Bitmap)m_pcBitmap.Clone();
if (alg_sign)
{
f();
}
}
Pic1.Image = brm.ToImage<Bgr, byte>().ToBitmap();
pcDisplayInfo.Image = pcFrameInfo.Image;
cc.m_MyCamera.DisplayOneFrame(ref pcDisplayInfo);
cc.m_MyCamera.FreeImageBuffer(ref pcFrameInfo);
}
else
{
Thread.Sleep(5);
}
}
}
}
Thread m_hReceiveThread =new Thread(ReceiveThreadProcess);