HWindowControl多线程显示异常

直接多线程访问,可能会出现显示异常的情况,代码如下

复制代码
            Task.Run(() =>
            {
                HOperatorSet.SetWindowParam(hWindowControl1.HalconWindow, "flush", "false");
                HOperatorSet.ClearWindow(hWindowControl1.HalconWindow);
                HObject ho_Rectangle;
                HOperatorSet.GenEmptyObj(out ho_Rectangle);
                HOperatorSet.GenRectangle1(out ho_Rectangle, 0, 0, 200, 200);

                hWindowControl1.HalconWindow.SetColor("red");
                hWindowControl1.HalconWindow.DispObj(ho_Rectangle);
                ho_Rectangle.Dispose();
                HOperatorSet.FlushBuffer(hWindowControl1.HalconWindow);

            });
复制代码

正确方式,应该使用委托, 代码如下:

复制代码
            Task.Run(() =>
            {
                if (hWindowControl1.InvokeRequired)
                {
                    hWindowControl1.BeginInvoke(new Action(() =>
                    {
                        //HOperatorSet.SetSystem("flush_graphic", "false");
                        HOperatorSet.SetWindowParam(hWindowControl1.HalconWindow, "flush", "false");
                        HObject ho_Rectangle;
                        HOperatorSet.GenEmptyObj(out ho_Rectangle);
                        HOperatorSet.GenRectangle1(out ho_Rectangle, 0, 0, 600, 600);

                        hWindowControl1.HalconWindow.SetColor("red");
                        hWindowControl1.HalconWindow.DispObj(ho_Rectangle);
                        ho_Rectangle.Dispose();
                        HOperatorSet.FlushBuffer(hWindowControl1.HalconWindow);

                    }));
                }
            });
复制代码

 有参数的代码如下

复制代码
 
        private void button4_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                if (hWindowControl1.InvokeRequired)
                {
                    Func<int, bool> fun1 = Fun1;

                    IAsyncResult ar = hWindowControl1.BeginInvoke(fun1, 0);
                    Debug.Print("Wait handle");
                    //ar.AsyncWaitHandle.WaitOne(-1, false);
                    Debug.Print(" handle");
                    //if ((bool)hWindowControl1.EndInvoke(ar))
                    //    Debug.Print("True");
                    //else
                    //    Debug.Print("False");

                }
                else
                {
                    Debug.Print("同步");
                    Fun1(0);
                }
                Debug.Print("End");

            });
        }



       private bool Fun1(int k)
        {
            //HOperatorSet.SetSystem("flush_graphic", "false");
            HOperatorSet.SetWindowParam(hWindowControl1.HalconWindow, "flush", "false");
            HObject ho_Rectangle;
            HOperatorSet.GenEmptyObj(out ho_Rectangle);
            HOperatorSet.GenRectangle1(out ho_Rectangle, 0, 0, 600, 600);

            hWindowControl1.HalconWindow.SetColor("red");
            hWindowControl1.HalconWindow.DispObj(ho_Rectangle);
            ho_Rectangle.Dispose();
            HOperatorSet.FlushBuffer(hWindowControl1.HalconWindow);
            Thread.Sleep(5000);
            Debug.Print(k.ToString());
            return false;
        }
复制代码

 

posted on   qq1151219115  阅读(336)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示