From 8a3ab64a65da226636743be07c4bee63f50da25d Mon Sep 17 00:00:00 2001
From: patrick.xu <patrick.xu@broconcentric.com>
Date: 星期六, 06 三月 2021 11:35:20 +0800
Subject: [PATCH] 1. 解决软件异常崩溃问题

---
 src/Bro.Device.Gocator/GocatorConfig.cs             |    1 
 src/Bro.UI.Model.Winform/Properties/AssemblyInfo.cs |    4 
 src/Bro.M071.Process/UI/M071_MainForm.cs            |   63 ++++++
 src/Bro.UI.Model.Winform/UI/CanvasImage.cs          |   18 +
 src/Bro.M071.Process/M071Process.cs                 |  143 +++++++++-----
 src/Bro.Device.Gocator/GocatorDriver.cs             |  256 ++++++++++++++-----------
 src/Bro.M071.Process/UI/M071_MainForm.Designer.cs   |   14 +
 src/Bro.Common.Device/DeviceBase/HDevEngineTool.cs  |   56 +++++
 src/Bro.M071.Process/M071Config.cs                  |    8 
 src/Bro.Common.Device/DeviceBase/CameraBase.cs      |   20 +-
 src/Bro.Device.Gocator/Properties/AssemblyInfo.cs   |    4 
 src/Bro.M071.Process/Properties/AssemblyInfo.cs     |    4 
 12 files changed, 406 insertions(+), 185 deletions(-)

diff --git a/src/Bro.Common.Device/DeviceBase/CameraBase.cs b/src/Bro.Common.Device/DeviceBase/CameraBase.cs
index ca7afb3..d96dc0d 100644
--- a/src/Bro.Common.Device/DeviceBase/CameraBase.cs
+++ b/src/Bro.Common.Device/DeviceBase/CameraBase.cs
@@ -397,17 +397,17 @@
             }
         }
 
-        public void ClearImageSet(string imgSetId)
-        {
-            IImageSet set = _imageSetList[imgSetId];
-            if (set != null)
-                ClearImageSet(set);
-        }
+        //public void ClearImageSet(string imgSetId)
+        //{
+        //    IImageSet set = _imageSetList[imgSetId];
+        //    if (set != null)
+        //        ClearImageSet(set);
+        //}
 
-        private void ImageSet_OnImageSetTimeout(ImageSet set)
-        {
-            ClearImageSet(set);
-        }
+        //private void ImageSet_OnImageSetTimeout(ImageSet set)
+        //{
+        //    ClearImageSet(set);
+        //}
 
         //private void ClearImageSetPeriodically()
         //{
diff --git a/src/Bro.Common.Device/DeviceBase/HDevEngineTool.cs b/src/Bro.Common.Device/DeviceBase/HDevEngineTool.cs
index ceb3068..7fc9b36 100644
--- a/src/Bro.Common.Device/DeviceBase/HDevEngineTool.cs
+++ b/src/Bro.Common.Device/DeviceBase/HDevEngineTool.cs
@@ -214,7 +214,7 @@
             }
         }
 
-        public static Bitmap ConvertHImgaeToBitmap(this HImage hImage)
+        public static Bitmap ConvertHImageToBitmap(this HImage hImage)
         {
             try
             {
@@ -272,5 +272,59 @@
 
             return img;
         }
+
+        public static Bitmap ConvertHImageTo16GrayBitmap(this HImage originHImage)
+        {
+            HImage hImage = originHImage.Clone();
+
+            //get_domain(Image, rectangle)
+            //* 鑾峰彇鍏ㄥ浘涓儚绱犵伆搴﹀�肩殑鏈�澶у拰鏈�灏忓��
+            //min_max_gray(rectangle, Image, 0, Min, Max, range)
+            hImage.MinMaxGray(hImage.GetDomain(), 0, out double min, out double max, out double range);
+
+            //* 灏�16浣嶅浘鐨勭伆搴﹀�兼槧灏勫埌0 - 255涓�
+            double mult = 255.0 / (max - min);
+            double add = -mult * min;
+            hImage = hImage.ScaleImage(mult, add);
+
+            //* 杞崲涓�'byte'绫诲瀷
+            //convert_image_type(Image_scaled, ImageConverted, 'byte')
+            hImage = hImage.ConvertImageType("byte");
+
+            Bitmap showImage = hImage.ConvertHImageToBitmap();
+
+            hImage.Dispose();
+
+            return showImage;
+        }
+
+        public static Bitmap ConvertSignedHImageTo16GrayBitmap(this HImage originHImage)
+        {
+            HImage hImage = originHImage.Clone();
+
+            hImage = hImage.ConvertImageType("int4");
+            hImage = hImage.ScaleImage(1.0, 32768);
+            hImage = hImage.ConvertImageType("uint2");
+
+            //get_domain(Image, rectangle)
+            //* 鑾峰彇鍏ㄥ浘涓儚绱犵伆搴﹀�肩殑鏈�澶у拰鏈�灏忓��
+            //min_max_gray(rectangle, Image, 0, Min, Max, range)
+            hImage.MinMaxGray(hImage.GetDomain(), 0, out double min, out double max, out double range);
+
+            //* 灏�16浣嶅浘鐨勭伆搴﹀�兼槧灏勫埌0 - 255涓�
+            double mult = 255.0 / (max - min);
+            double add = -mult * min;
+            hImage = hImage.ScaleImage(mult, add);
+
+            //* 杞崲涓�'byte'绫诲瀷
+            //convert_image_type(Image_scaled, ImageConverted, 'byte')
+            hImage = hImage.ConvertImageType("byte");
+
+            Bitmap showImage = hImage.ConvertHImageToBitmap();
+
+            hImage.Dispose();
+
+            return showImage;
+        }
     }
 }
diff --git a/src/Bro.Device.Gocator/GocatorConfig.cs b/src/Bro.Device.Gocator/GocatorConfig.cs
index 40ec8ba..27df208 100644
--- a/src/Bro.Device.Gocator/GocatorConfig.cs
+++ b/src/Bro.Device.Gocator/GocatorConfig.cs
@@ -50,6 +50,7 @@
 
         [Category("鏁版嵁浣嶉厤缃�")]
         [Description("鍥惧儚鏁版嵁浣嶆暟锛�2浣�/4浣�")]
+        [Browsable(false)]
         public GocatorDataByteNums ByteNums { get; set; } = GocatorDataByteNums.Byte2;
     }
 
diff --git a/src/Bro.Device.Gocator/GocatorDriver.cs b/src/Bro.Device.Gocator/GocatorDriver.cs
index 99263dc..ffec5c6 100644
--- a/src/Bro.Device.Gocator/GocatorDriver.cs
+++ b/src/Bro.Device.Gocator/GocatorDriver.cs
@@ -91,13 +91,12 @@
                             long bufferSize = width * height;
                             IntPtr bufferPointer = surfaceMsg.Data;
 
-
                             float zoomFactor = (float)((double)surfaceMsg.YResolution / (double)surfaceMsg.XResolution);
                             int zoomHeight = (int)(zoomFactor * height);
 
-                            //IntPtr zoomPtr = Marshal.AllocHGlobal(zoomHeight * (int)width * 2);
+                            IntPtr zoomPtr = Marshal.AllocHGlobal(zoomHeight * (int)width * 2);
                             //IntPtr zoomPtr = Marshal.AllocHGlobal(zoomHeight * (int)width * 4);
-                            IntPtr zoomPtr = Marshal.AllocHGlobal(zoomHeight * (int)width * (int)IIConfig.ByteNums);
+                            //IntPtr zoomPtr = Marshal.AllocHGlobal(zoomHeight * (int)width * (int)IIConfig.ByteNums);
 
                             //娌℃湁鎻掑�硷紝榛樿0
                             //Parallel.For(0, height, h =>
@@ -105,47 +104,52 @@
                             //      CopyMemory((IntPtr)((long)zoomPtr + width * 2 * Math.Floor(h * zoomFactor)), (IntPtr)((long)bufferPointer + width * 2 * h), width * 2);
                             //  });
 
-                            if (IIConfig.ByteNums == GocatorDataByteNums.Byte2)
+                            //if (IIConfig.ByteNums == GocatorDataByteNums.Byte2)
+                            //{
+                            //浣跨敤涓婁竴琛屽師鏈夋暟鎹�
+                            Parallel.For(0, zoomHeight, h =>
                             {
-                                //浣跨敤涓婁竴琛屽師鏈夋暟鎹�
-                                Parallel.For(0, zoomHeight, h =>
-                                {
-                                    int originHeightIndex = (int)Math.Floor((double)height * h / (double)zoomHeight);
+                                int originHeightIndex = (int)Math.Floor((double)height * h / (double)zoomHeight);
+                                CopyMemory((IntPtr)((long)zoomPtr + width * 2 * h), (IntPtr)((long)bufferPointer + width * 2 * originHeightIndex), width * 2);
+                            });
+                            //}
+                            //else
+                            //{
+                            //    //浣跨敤涓婁竴琛屽師鏈夋暟鎹�
+                            //    Parallel.For(0, zoomHeight, h =>
+                            //    {
+                            //        int originHeightIndex = (int)Math.Floor((double)height * h / (double)zoomHeight);
 
-                                    CopyMemory((IntPtr)((long)zoomPtr + width * 2 * h), (IntPtr)((long)bufferPointer + width * 2 * originHeightIndex), width * 2);
-                                });
-                            }
-                            else
-                            {
-                                //浣跨敤涓婁竴琛屽師鏈夋暟鎹�
-                                Parallel.For(0, zoomHeight, h =>
-                                {
-                                    int originHeightIndex = (int)Math.Floor((double)height * h / (double)zoomHeight);
+                            //        byte[] rowBuffer = new byte[width * 4];
+                            //        Parallel.For(0, width, w =>
+                            //        {
+                            //            rowBuffer[w * 4 + 2] = Marshal.ReadByte(bufferPointer, (int)(width * 2 * originHeightIndex + w * 2));
+                            //            rowBuffer[w * 4 + 3] = Marshal.ReadByte(bufferPointer, (int)(width * 2 * originHeightIndex + w * 2 + 1));
+                            //        });
 
-                                    byte[] rowBuffer = new byte[width * 4];
-                                    Parallel.For(0, width, w =>
-                                    {
-                                        rowBuffer[w * 4 + 2] = Marshal.ReadByte(bufferPointer, (int)(width * 2 * originHeightIndex + w * 2));
-                                        rowBuffer[w * 4 + 3] = Marshal.ReadByte(bufferPointer, (int)(width * 2 * originHeightIndex + w * 2 + 1));
-                                    });
-
-                                    Marshal.Copy(rowBuffer, 0, (IntPtr)((long)zoomPtr + width * 2 * h), rowBuffer.Length);
-                                });
-                            }
+                            //        Marshal.Copy(rowBuffer, 0, (IntPtr)((long)zoomPtr + width * 2 * h), rowBuffer.Length);
+                            //    });
+                            //}
 
                             if (imgSet != null)
                             {
                                 imgSet.HImage = new HImage();
                                 //imgSet.HImage.GenImage1("uint2", (int)width, zoomHeight, zoomPtr);
                                 //imgSet.HImage.GenImage1("int4", (int)width, zoomHeight, zoomPtr);
-                                imgSet.HImage.GenImage1(IIConfig.ByteNums == GocatorDataByteNums.Byte2 ? "uint2" : "int4", (int)width, zoomHeight, zoomPtr);
+                                //imgSet.HImage.GenImage1(IIConfig.ByteNums == GocatorDataByteNums.Byte2 ? "uint2" : "int4", (int)width, zoomHeight, zoomPtr);
 
-                                //imgSet.HImage_2 = imgSet.HImage.Clone();
+                                imgSet.HImage.GenImage1("int2", (int)width, zoomHeight, zoomPtr);
+
+                                //imgSet.HImage = imgSet.HImage.ConvertImageType("int4");
+                                //imgSet.HImage = imgSet.HImage.ScaleImage(1.0, short.MaxValue + 1.0);
+                                //imgSet.HImage = imgSet.HImage.ConvertImageType("uint2");
+                                imgSet.HImage_2 = new HImage();
+                                imgSet.HImage_2.GenImage1("int2", (int)width, zoomHeight, zoomPtr);
                                 //imgSet.HImage_2.GenImage1("uint2", (int)width, zoomHeight, zoomPtr);
                                 //imgSet.HImage_2.GenImage1("int4", (int)width, zoomHeight, zoomPtr);
 
-                                imgSet.HImage_2 = new HImage();
-                                imgSet.HImage_2.GenImage1(IIConfig.ByteNums == GocatorDataByteNums.Byte2 ? "uint2" : "int4", (int)width, zoomHeight, zoomPtr);
+                                //imgSet.HImage_2 = new HImage();
+                                //imgSet.HImage_2.GenImage1(IIConfig.ByteNums == GocatorDataByteNums.Byte2 ? "uint2" : "int4", (int)width, zoomHeight, zoomPtr);
 
                                 LaserScanParam para = new LaserScanParam()
                                 {
@@ -162,6 +166,12 @@
                                 //imgSet.HImage_2 = imgSet.HImage_2.ZoomImageSize((int)width, zoomHeight, "constant");
                             }
 
+                            //var showImage = imgSet.HImage_2.ConvertSignedHImageTo16GrayBitmap();
+                            //showImage.Save($@"D:\SI\{DateTime.Now.ToString("yyyyMMddHHmmss")}.tif", System.Drawing.Imaging.ImageFormat.Tiff);
+
+                            //SaveOriginImage(null, showImage, imgSet.Id);
+
+                            //Marshal.FreeHGlobal(zoomPtr);
                             Generate16GrayImageByPointer((int)width, zoomHeight, zoomPtr, imgSet?.Id).ContinueWith(t =>
                             {
                                 Marshal.FreeHGlobal(zoomPtr);
@@ -227,34 +237,7 @@
             {
                 if (opConfig.IsOpenConnection)
                 {
-                    while (sensor.State != GoState.Ready)
-                    {
-                        Thread.Sleep(10);
-                    }
-
-                    do
-                    {
-                        try
-                        {
-                            sensor.Start();
-                            LogAsync(DateTime.Now, $"浼犳劅鍣ㄧ姸鎬侊細{sensor.State.ToString()}", "");
-                            if (sensor.State != GoState.Running)
-                            {
-                                Thread.Sleep(100);
-                            }
-                            else
-                            {
-                                break;
-                            }
-                        }
-                        catch (Exception ex)
-                        {
-                            LogAsync(DateTime.Now, $"寮�鍚紓甯革細{ex.GetExceptionMessage()}", "");
-                            Thread.Sleep(100);
-                        }
-                    } while (true);
-
-                    LogAsync(DateTime.Now, $"浼犳劅鍣ㄥ惎鍔ㄦ垚鍔�", "");
+                    StartSensor();
                 }
 
                 if (!opConfig.IsSnapshotAction)
@@ -277,10 +260,12 @@
                         if (!_snapHandle.WaitOne(IIConfig.SnapshotTimeout))
                         {
                             LogAsync(DateTime.Now, $"{Name}鑾峰彇鍥惧儚瓒呮椂", "");
-                            return null;
+                            return imgSet;
                         }
 
                         dataSet = _currentData;
+
+                        //dataSet = system.ReceiveData(IIConfig.SnapshotTimeout);
                     }
                 }
                 else
@@ -322,38 +307,9 @@
             {
                 if (!opConfig.IsOpenConnection)
                 {
-                    while (sensor.State == GoState.Busy)
-                    {
-                        Thread.Sleep(100);
-                    }
-
-                    do
-                    {
-                        try
-                        {
-                            sensor.Stop();
-
-                            LogAsync(DateTime.Now, $"浼犳劅鍣ㄧ姸鎬侊細{sensor.State.ToString()}", "");
-                            if (sensor.State != GoState.Ready)
-                            {
-                                Thread.Sleep(100);
-                            }
-                            else
-                            {
-                                break;
-                            }
-                        }
-                        catch (Exception ex)
-                        {
-                            LogAsync(DateTime.Now, $"鍏抽棴寮傚父锛歿ex.GetExceptionMessage()}", "");
-                            Thread.Sleep(100);
-                        }
-                    } while (true);
-                    LogAsync(DateTime.Now, $"浼犳劅鍣ㄥ叧闂垚鍔�", "");
+                    StopSensor();
                 }
             }
-
-            sensor.Flush();
 
             if (dataSet != null)
             {
@@ -367,7 +323,72 @@
                 }
             }
 
+            sensor.Flush();
             return imgSet;
+        }
+
+        private void StopSensor()
+        {
+            while (sensor.State == GoState.Busy)
+            {
+                Thread.Sleep(100);
+            }
+
+            do
+            {
+                try
+                {
+                    sensor.Stop();
+
+                    LogAsync(DateTime.Now, $"浼犳劅鍣ㄧ姸鎬侊細{sensor.State.ToString()}", "");
+                    if (sensor.State != GoState.Ready)
+                    {
+                        Thread.Sleep(100);
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+                catch (Exception ex)
+                {
+                    LogAsync(DateTime.Now, $"鍏抽棴寮傚父锛歿ex.GetExceptionMessage()}", "");
+                    Thread.Sleep(100);
+                }
+            } while (true);
+            LogAsync(DateTime.Now, $"浼犳劅鍣ㄥ叧闂垚鍔�", "");
+        }
+
+        private void StartSensor()
+        {
+            while (sensor.State != GoState.Ready)
+            {
+                Thread.Sleep(10);
+            }
+
+            do
+            {
+                try
+                {
+                    sensor.Start();
+                    LogAsync(DateTime.Now, $"浼犳劅鍣ㄧ姸鎬侊細{sensor.State.ToString()}", "");
+                    if (sensor.State != GoState.Running)
+                    {
+                        Thread.Sleep(100);
+                    }
+                    else
+                    {
+                        break;
+                    }
+                }
+                catch (Exception ex)
+                {
+                    LogAsync(DateTime.Now, $"寮�鍚紓甯革細{ex.GetExceptionMessage()}", "");
+                    Thread.Sleep(100);
+                }
+            } while (true);
+
+            LogAsync(DateTime.Now, $"浼犳劅鍣ㄥ惎鍔ㄦ垚鍔�", "");
         }
 
         float _currentExposure = 0;
@@ -433,6 +454,7 @@
 
             system.EnableData(true);
 
+
             if (IIConfig.IsAsyncMode)
             {
                 system.SetDataHandler(onData);
@@ -465,22 +487,26 @@
         {
             base.Start();
 
-            if (sensor.State != GoState.Ready)
-            {
-                system.Start();
-            }
+            //if (sensor.State != GoState.Ready)
+            //{
+            //    system.Start();
+            //}
 
             if (IIConfig.IsAsyncMode)
             {
-                sensor.Start();
+                //sensor.Start();
+
+                StartSensor();
             }
-            else
-            {
-                //if (sensor.State == GoState.Ready)
-                {
-                    sensor.Stop();
-                }
-            }
+            //else
+            //{
+            //    //if (sensor.State == GoState.Ready)
+            //    //{
+            //    //    sensor.Stop();
+            //    //}
+
+            //    StopSensor();
+            //}
         }
 
         protected override void Stop()
@@ -488,7 +514,9 @@
             base.Stop();
 
             if (IIConfig.IsAsyncMode)
-                system.Stop();
+            {
+                StopSensor();
+            }
 
             if (IIConfig.IsUseAccelerator)
             {
@@ -517,7 +545,7 @@
         }
 
         volatile bool _snapFlag = false;
-        readonly ManualResetEvent _snapHandle = new ManualResetEvent(false);
+        readonly AutoResetEvent _snapHandle = new AutoResetEvent(false);
 
         GoDataSet _currentData = null;
         /// <summary>
@@ -526,6 +554,7 @@
         /// <param name="data"></param>
         private void onData(KObject data)
         {
+            LogAsync(DateTime.Now, $"鎵弿鍥惧儚杈撳嚭", "");
             GoDataSet dataSet = (GoDataSet)data;
 
             if (IIConfig.IsHardwareTrigger)
@@ -546,11 +575,13 @@
             }
             else
             {
-                if (_snapFlag)
+                //if (_snapFlag)
                 {
                     _snapFlag = false;
 
                     _currentData = dataSet.Clone<GoDataSet>();
+
+                    _currentData = dataSet;
                     _snapHandle.Set();
                 }
             }
@@ -571,8 +602,6 @@
             if (set == null)
                 return;
 
-            set.Image = map;
-
             await Task.Run(() =>
             {
                 lock (set.SaveLock)
@@ -586,6 +615,8 @@
                             //SaveImageByNameAndType(map, set.Id, set.ImageSaveOption.ImageFormat, imgDir);
                             string filePath = Path.Combine(imgDir, $"{set.Id}.tif");
                             set.HImage_2.WriteImage("tiff", 0, filePath);
+                            set.HImage_2.Dispose();
+                            set.HImage_2 = null;
                         }
                         catch (Exception ex)
                         {
@@ -616,11 +647,6 @@
                     if (set.ImageSaveOption.AddtionalSaveType.Contains(prefix) && !set.IsAddtionalSaved)
                     {
                         string imgDir = CheckImageDirectory(set.ImageSaveOption.ImageSaveSubDirectory, prefix);
-
-                        while (set.Image == null)
-                        {
-                            Thread.Sleep(50);
-                        }
 
                         try
                         {
@@ -657,10 +683,10 @@
 
         public override void Dispose()
         {
-            base.Dispose();
+            //HImage_2?.Dispose();
+            //HImage_2 = null;
 
-            HImage_2?.Dispose();
-            HImage_2 = null;
+            base.Dispose();
         }
     }
 }
diff --git a/src/Bro.Device.Gocator/Properties/AssemblyInfo.cs b/src/Bro.Device.Gocator/Properties/AssemblyInfo.cs
index 3407a97..20ca3eb 100644
--- a/src/Bro.Device.Gocator/Properties/AssemblyInfo.cs
+++ b/src/Bro.Device.Gocator/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 //鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滅敓鎴愬彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊�
 //閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.2.0")]
-[assembly: AssemblyFileVersion("1.0.2.0")]
+[assembly: AssemblyVersion("1.0.3.0")]
+[assembly: AssemblyFileVersion("1.0.3.0")]
diff --git a/src/Bro.M071.Process/M071Config.cs b/src/Bro.M071.Process/M071Config.cs
index e9f1b94..d2bcd20 100644
--- a/src/Bro.M071.Process/M071Config.cs
+++ b/src/Bro.M071.Process/M071Config.cs
@@ -201,6 +201,14 @@
         }
     }
 
+    [Device("ManualTest", "鎵嬪姩娴嬭瘯鎿嶄綔閰嶇疆", EnumHelper.DeviceAttributeType.OperationConfig)]
+    public class ManualTestOperationConfig : OperationConfigBase
+    {
+        [Category("鎵嬪姩娴嬭瘯閰嶇疆")]
+        [Description("鎵嬪姩娴嬭瘯閲嶅娆℃暟")]
+        public int RepeatTimes { get; set; } = 1;
+    }
+
     public class OperationCombination : IComplexDisplay, IHalconToolPath
     {
         [Category("杩愬姩鏈烘瀯閰嶇疆")]
diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs
index 9f967b6..69301a8 100644
--- a/src/Bro.M071.Process/M071Process.cs
+++ b/src/Bro.M071.Process/M071Process.cs
@@ -195,6 +195,37 @@
         }
         #endregion
 
+
+        AutoResetEvent _jobDoneHandle = new AutoResetEvent(false);
+        [ProcessMethod("ManualTest", "ManualTest", "鎵嬪姩娴嬭瘯", InvokeType.TestInvoke)]
+        public ProcessResponse ManualTest(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
+        {
+            if (config is ManualTestOperationConfig opConfig)
+            {
+                Task.Run(async () =>
+                {
+                    for (int i = 0; i < opConfig.RepeatTimes; i++)
+                    {
+                        BarCode = $"Test_{i + 1}";
+                        StartJob(null, null, null);
+
+                        if (_jobDoneHandle.WaitOne(20000))
+                        {
+                            LogAsync(DateTime.Now, $"绗瑊i + 1}娆′换鍔″畬鎴�", "");
+                            await Task.Delay(500);
+                        }
+                        else
+                        {
+                            LogAsync(DateTime.Now, $"绗瑊i + 1}娆′换鍔¤秴鏃�", "");
+                            break;
+                        }
+                    }
+                });
+            }
+
+            return new ProcessResponse(true);
+        }
+
         object productionLock = new object();
         List<ProductionMeasurement> productionList = new List<ProductionMeasurement>();
 
@@ -394,7 +425,6 @@
 
         private void StartCheck()
         {
-
             if (isRightStart && isLeftStart)
             {
                 if (_isdoing)
@@ -630,6 +660,8 @@
                     }
                 }
 
+                _jobDoneHandle.Set();
+
                 var measurementUnitResultAndKeyUnitDataSet = GetMeasurementUnitResultAndKeyUnitData(pMeasure);
 
                 if (pMeasure.PResult != "NA")
@@ -821,6 +853,7 @@
         //}
 
         static object excelExportLock = new object();
+        string fileName = "";
         private async void ExportProductionInColumns(ProductionMeasurementUnitResultAndKeyUnitDataSet exportData)
         {
             if (!Config.IsCSVOutputEnabled)
@@ -834,7 +867,11 @@
                     {
                         Directory.CreateDirectory(Config.LogPath);
                     }
-                    var fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd")}.xlsx");
+
+                    if (string.IsNullOrWhiteSpace(fileName))
+                    {
+                        fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.xlsx");
+                    }
 
                     try
                     {
@@ -1139,9 +1176,10 @@
                     catch (Exception ex)
                     {
                         LogAsync(DateTime.Now, "Excel鏃ュ織寮傚父", ex.GetExceptionMessage());
-                        string bkFileName = Path.Combine(Config.LogPath, $"{Path.GetFileNameWithoutExtension(fileName)}_bk_{DateTime.Now.ToString("HHmmss")}.xlsx");
-                        File.Copy(fileName, bkFileName);
-                        File.Delete(fileName);
+                        fileName = Path.Combine(Config.LogPath, $"LDSData_{DateTime.Now.ToString("yyyyMMdd_HHmmss")}.xlsx");
+                        //string bkFileName = Path.Combine(Config.LogPath, $"{Path.GetFileNameWithoutExtension(fileName)}_bk_{DateTime.Now.ToString("HHmmss")}.xlsx");
+                        //File.Copy(fileName, bkFileName);
+                        //File.Delete(fileName);
                     }
                 }
             });
@@ -1263,6 +1301,8 @@
         }
         #endregion
 
+        static object _resultCalcLock = new object();
+
         private async void RunImageHandle(IOperationConfig opConfig, IImageSet imgSet, string snapshotId, string snapshotName, List<MeasurementUnit> measureList)
         {
             await Task.Run(() =>
@@ -1340,71 +1380,74 @@
                 //    Directory.CreateDirectory(dir);
                 //}
 
-                //Parallel.For(1, count.I + 1, (i) =>
-                for (int i = 1; i <= count.I; i++)
+                lock (_resultCalcLock)
                 {
-                    HOperatorSet.SelectObj(images, out HObject image, i);
-
-                    //string fileName = Path.Combine(dir, $"{i}.tif");
-                    //using (HImage temp = image.ConvertHObjectToHImage())
-                    //{
-                    //    temp.WriteImage("tiff", 0, fileName);
-                    //}
-
-                    keys.Where(u => u.ImageSeq == i).ToList().ForEach(k =>
+                    //Parallel.For(1, count.I + 1, (i) =>
+                    for (int i = 1; i <= count.I; i++)
                     {
-                        Dictionary<string, double> resultDict = null;
+                        HOperatorSet.SelectObj(images, out HObject image, i);
 
-                        var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList();
+                        //string fileName = Path.Combine(dir, $"{i}.tif");
+                        //using (HImage temp = image.ConvertHObjectToHImage())
+                        //{
+                        //    temp.WriteImage("tiff", 0, fileName);
+                        //}
 
-                        string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath;
-                        if (!_halconToolDict.ContainsKey(keyToolKey))
+                        keys.Where(u => u.ImageSeq == i).ToList().ForEach(k =>
                         {
-                            LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曟湭鍒濆鍖�", "");
-                        }
-                        else
-                        {
-                            _halconToolDict[keyToolKey].InputImageDic["INPUT_Image"] = image;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_X"] = scanParam.Resolution_X / 1000000.0;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Y"] = scanParam.Resolution_Y / 1000000.0;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Z"] = scanParam.Resolution_Z / 1000000.0;
-                            _halconToolDict[keyToolKey].InputTupleDic["INPUT_ImageId"] = $"{k.AliasName}_{DateTime.Now.ToString("HHmmssfff")}.tif";
-                            if (!_halconToolDict[keyToolKey].RunProcedure(out string error))
+                            Dictionary<string, double> resultDict = null;
+
+                            var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList();
+
+                            string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath;
+                            if (!_halconToolDict.ContainsKey(keyToolKey))
                             {
-                                LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", "");
+                                LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曟湭鍒濆鍖�", "");
                             }
                             else
                             {
-                                var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").DArr.ToList();
-                                if (results.Count == 0 || results.Any(u => u < 0))
+                                _halconToolDict[keyToolKey].InputImageDic["INPUT_Image"] = image;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_X"] = scanParam.Resolution_X / 1000000.0;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Y"] = scanParam.Resolution_Y / 1000000.0;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Z"] = scanParam.Resolution_Z / 1000000.0;
+                                _halconToolDict[keyToolKey].InputTupleDic["INPUT_ImageId"] = $"{k.AliasName}_{DateTime.Now.ToString("HHmmssfff")}.tif";
+                                if (!_halconToolDict[keyToolKey].RunProcedure(out string error))
                                 {
-                                    LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁寮傚父", "");
+                                    LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", "");
                                 }
                                 else
                                 {
-                                    //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}");
-
-                                    results = results.Select(u => u - Config.PlanCompensation).ToList();
-                                    resultDict = k.KeyResultList.ToDictionary(u => u, u =>
+                                    var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").DArr.ToList();
+                                    if (results.Count == 0 || results.Any(u => u < 0))
                                     {
-                                        int index = k.KeyResultList.IndexOf(u);
-                                        return results[index];
-                                    });
+                                        LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁寮傚父", "");
+                                    }
+                                    else
+                                    {
+                                        //LogAsync(DateTime.Now, $"{k.AliasName}鍘熷鏁版嵁", $"{string.Join(" ", results)}");
+
+                                        results = results.Select(u => u - Config.PlanCompensation).ToList();
+                                        resultDict = k.KeyResultList.ToDictionary(u => u, u =>
+                                        {
+                                            int index = k.KeyResultList.IndexOf(u);
+                                            return results[index];
+                                        });
+                                    }
                                 }
                             }
-                        }
 
-                        keyBindList.ForEach(kb =>
-                        {
-                            kb.KeyImages.Add(image.ConvertHObjectToHImage());
-                            kb.FillKeyValues(resultDict);
+                            keyBindList.ForEach(kb =>
+                            {
+                                kb.KeyImages.Add(image.ConvertHObjectToHImage());
+                                kb.FillKeyValues(resultDict);
+                            });
                         });
-                    });
 
-                    image.Dispose();
-                    image = null;
+                        image.Dispose();
+                        image = null;
+                    }
+                    //);
                 }
-                //);
 
                 imgSet.HImage.Dispose();
                 imgSet.HImage = null;
diff --git a/src/Bro.M071.Process/Properties/AssemblyInfo.cs b/src/Bro.M071.Process/Properties/AssemblyInfo.cs
index 86af5ac..900ca23 100644
--- a/src/Bro.M071.Process/Properties/AssemblyInfo.cs
+++ b/src/Bro.M071.Process/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 //鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滅敓鎴愬彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊�
 //閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.4.1")]
-[assembly: AssemblyFileVersion("1.0.4.1")]
+[assembly: AssemblyVersion("1.0.5.0")]
+[assembly: AssemblyFileVersion("1.0.5.0")]
diff --git a/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs b/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs
index a98bd9b..ddfc076 100644
--- a/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs
+++ b/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs
@@ -53,6 +53,7 @@
             this.lblOperator = new System.Windows.Forms.Label();
             this.stStripHint = new System.Windows.Forms.StatusStrip();
             this.tsslError = new System.Windows.Forms.ToolStripStatusLabel();
+            this.button1 = new System.Windows.Forms.Button();
             this.contextMenuStrip1.SuspendLayout();
             this.plImage.SuspendLayout();
             this.tscEditLocation.ContentPanel.SuspendLayout();
@@ -342,11 +343,23 @@
             this.tsslError.Size = new System.Drawing.Size(131, 17);
             this.tsslError.Text = "toolStripStatusLabel1";
             // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(591, 13);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(75, 23);
+            this.button1.TabIndex = 8;
+            this.button1.Text = "button1";
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Visible = false;
+            this.button1.Click += new System.EventHandler(this.button1_Click);
+            // 
             // M071_MainForm
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.ClientSize = new System.Drawing.Size(1069, 351);
+            this.Controls.Add(this.button1);
             this.Controls.Add(this.stStripHint);
             this.Controls.Add(this.lblOperator);
             this.Controls.Add(this.btnReset);
@@ -403,5 +416,6 @@
         private System.Windows.Forms.Label lblOperator;
         private System.Windows.Forms.StatusStrip stStripHint;
         private System.Windows.Forms.ToolStripStatusLabel tsslError;
+        private System.Windows.Forms.Button button1;
     }
 }
\ No newline at end of file
diff --git a/src/Bro.M071.Process/UI/M071_MainForm.cs b/src/Bro.M071.Process/UI/M071_MainForm.cs
index 1266611..8849ca7 100644
--- a/src/Bro.M071.Process/UI/M071_MainForm.cs
+++ b/src/Bro.M071.Process/UI/M071_MainForm.cs
@@ -24,6 +24,9 @@
         M071Config Config => Process?.IConfig as M071Config;
         M071Process Process_M071 => Process as M071Process;
 
+        System.Threading.Timer _refreshUITimer = null;
+
+
         public M071_MainForm()
         {
             InitializeComponent();
@@ -36,6 +39,7 @@
 
             tscEditLocation.Visible = tsmiShowEditor.Checked = false;
 
+            _refreshUITimer = new System.Threading.Timer(OnRefreshUI, null, -1, -1);
             this.Load += async (s, e) =>
                {
                    await Task.Delay(300);
@@ -44,7 +48,7 @@
                    cvImage.OnElementChangedHandle -= CvImage_OnElementChangedHandle;
                    cvImage.OnElementChangedHandle += CvImage_OnElementChangedHandle;
 
-                   timer1.Enabled = true;
+                   //timer1.Enabled = true;
 
                    btnReset.Text = $"澶嶄綅锛堥暱鎸墈Config.FullResetRequiredDuration}绉掑ぇ澶嶄綅锛�";
 
@@ -279,6 +283,12 @@
         #endregion
 
         #region 鏍囩缁撴灉鏄剧ず
+
+        private void OnRefreshUI(object state)
+        {
+            cvImage.Invoke(new Action(() => Refresh()));
+        }
+
         private async void Process_M071_OnElementUpdated(Common.Interface.IShapeElement obj)
         {
             //this.Invoke(new Action(() =>
@@ -307,7 +317,8 @@
                     (ele as KeyIndicator).Text = keyIndicator.Text;
                     (ele as KeyIndicator).ResultState = keyIndicator.ResultState;
 
-                    this.Invalidate();
+                    //this.Invalidate();
+                    _refreshUITimer.Change(1000, -1);
                 }));
             }
 
@@ -533,7 +544,7 @@
 
         private void timer1_Tick(object sender, EventArgs e)
         {
-            cvImage.Refresh();
+            //cvImage.Refresh();
         }
 
         private void lblOperator_DoubleClick(object sender, EventArgs e)
@@ -574,5 +585,51 @@
                 }));
             });
         }
+
+        bool isStart = true;
+        private void button1_Click(object sender, EventArgs e)
+        {
+            Task.Run(async () =>
+            {
+                try
+                {
+                    for (int j = 0; j < 10000; j++)
+                    {
+                        int i = 0;
+
+                        if (isStart)
+                        {
+                            cvImage.Elements.ToList().ForEach(ele =>
+                            {
+                                if (ele is KeyIndicator indicator)
+                                {
+                                    indicator.Text = "";
+                                    indicator.ResultState = null;
+                                }
+                            });
+                        }
+                        else
+                        {
+                            cvImage.Elements.ToList().ForEach(ele =>
+                            {
+                                if (ele is KeyIndicator indicator)
+                                {
+                                    indicator.Text = (i++).ToString();
+                                    indicator.ResultState = true;
+                                }
+                            });
+                        }
+                        isStart = !isStart;
+                        cvImage.BeginInvoke(new Action(() => Refresh()));
+                        LogAsync(DateTime.Now, $"UI Refresh {j}", "");
+                        await Task.Delay(300);
+                    }
+                }
+                catch (Exception ex)
+                {
+                }
+
+            });
+        }
     }
 }
diff --git a/src/Bro.UI.Model.Winform/Properties/AssemblyInfo.cs b/src/Bro.UI.Model.Winform/Properties/AssemblyInfo.cs
index 6387310..cb0810f 100644
--- a/src/Bro.UI.Model.Winform/Properties/AssemblyInfo.cs
+++ b/src/Bro.UI.Model.Winform/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 //鍙互鎸囧畾鎵�鏈夎繖浜涘�硷紝涔熷彲浠ヤ娇鐢ㄢ�滅敓鎴愬彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊�
 //閫氳繃浣跨敤 "*"锛屽涓嬫墍绀�:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyVersion("1.0.1.0")]
+[assembly: AssemblyFileVersion("1.0.1.0")]
diff --git a/src/Bro.UI.Model.Winform/UI/CanvasImage.cs b/src/Bro.UI.Model.Winform/UI/CanvasImage.cs
index 978e513..582061d 100644
--- a/src/Bro.UI.Model.Winform/UI/CanvasImage.cs
+++ b/src/Bro.UI.Model.Winform/UI/CanvasImage.cs
@@ -67,8 +67,21 @@
         #endregion
 
         #region 閲嶇粯
+        volatile bool _isInRepaint = false;
+        object _isInRepaintLock = new object();
         protected override void OnPaint(PaintEventArgs e)
         {
+            //if (_isInRepaint)
+            //    return;
+
+            //lock (_isInRepaintLock)
+            //{
+            //    if (_isInRepaint)
+            //        return;
+            //}
+
+            //_isInRepaint = true;
+
             try
             {
                 Rectangle rect = ClientRectangle;
@@ -78,6 +91,9 @@
                 Graphics g = myBuffer.Graphics;
                 g.SmoothingMode = SmoothingMode.HighSpeed;
                 g.PixelOffsetMode = PixelOffsetMode.HighSpeed;
+                g.InterpolationMode = InterpolationMode.Low;
+                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
+                g.CompositingQuality = CompositingQuality.HighSpeed;
                 g.Clear(BackColor);
 
                 g.MultiplyTransform(Matrix);
@@ -173,6 +189,8 @@
             catch (Exception)
             {
             }
+
+            _isInRepaint = false;
         }
 
         private void halfTransparent()

--
Gitblit v1.8.0