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 2022-08-10 11:26  qq1151219115  阅读(280)  评论(0编辑  收藏  举报