Prechádzať zdrojové kódy

C#的线程创建需要时间,如果在线程创建期间连续运行回车事件,将会产生多个线程。

Jeff 2 rokov pred
rodič
commit
d228d5fb27
1 zmenil súbory, kde vykonal 17 pridanie a 7 odobranie
  1. 17 7
      FactoryTool_CShare/Views/OperationPanel.cs

+ 17 - 7
FactoryTool_CShare/Views/OperationPanel.cs

@@ -768,6 +768,18 @@ namespace MOKA_Factory_Tools
             GC.Collect();
         }
 
+
+        private void StartWriteKeyThread()
+        {
+            if ( !Monitor.IsEntered(WriteKeyThreadLock) )
+            {
+                Monitor.Enter(WriteKeyThreadLock);
+                timer1.Start();
+                WritekeyThread = new Thread(Writekey);
+                WritekeyThread.Start();
+            }
+        }
+
         /// <summary>
         /// 扫描触发抄写,以回车终结触发
         /// </summary>
@@ -1010,9 +1022,7 @@ namespace MOKA_Factory_Tools
                         WriteDSN.Checked = (keyInfo.DSN.Length > 0 && m_writeDSN.Text != LResource.Skip);
                         WritePSN.Checked = FunctionSettingNow.BarcodeWrite;
 
-                        timer1.Start();
-                        Thread t = new Thread(Writekey);
-                        t.Start();
+                        StartWriteKeyThread();
                     }
                     else
                     {
@@ -1744,7 +1754,6 @@ namespace MOKA_Factory_Tools
         /// </summary>
         public void Writekey()
         {
-            Monitor.Enter(WriteKeyThreadLock);
             DateTime startTime = DateTime.Now;
             ArrayList keypath = new ArrayList();
             ArrayList keyStream = new ArrayList();
@@ -5424,10 +5433,8 @@ namespace MOKA_Factory_Tools
             bool preloadresult = false;
 
             preloadresult = true;
-            timer1.Start();
             UpdateKeys(midListNow.keytype, true);
-            WritekeyThread = new Thread(Writekey);
-            WritekeyThread.Start();
+            StartWriteKeyThread();
             if (!preloadresult)
             {
                 SNText.Enabled = true;
@@ -5618,6 +5625,9 @@ namespace MOKA_Factory_Tools
                     {
                         Thread.Sleep(100);
                     }
+
+                    if (Monitor.IsEntered(WriteKeyThreadLock))
+                        Monitor.Exit(WriteKeyThreadLock);
                 }
             }
             UsingTime_Text.Text = "0";