C# 解决如何在线程内修改主进程中控件属性的问题(委托,方法)

Invoke

问题描述:实时取像时(这里用的是MvCamCtrl.Net.dll)对图像进行算法操作,主页面需要更新图里处理后得到的坐标值,此时取像函数是通过新的线程执行,那么如何在取像的线程中跨进程访问控件,并且修改其属性值?

如图:案例中修改了两个textbox的值属性

在这里插入图片描述

代码描述,创建一个委托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);
                        }

                        // ch:保存Bitmap数据 | en:Save Bitmap Data
                        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();
                        // alg_sign:bool类型,是否执行检测算法
                        if (alg_sign)
                        {
                            f();
                        }
                    }
                    Pic1.Image = brm.ToImage<Bgr, byte>().ToBitmap();
                    //pcDisplayInfo.WindowHandle = Pic1.Handle;
                    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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值