From d22349714c8d199c02f336f90fba841ef8f5cd39 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期五, 21 十一月 2025 17:46:23 +0800
Subject: [PATCH] 优化内存后最终版202511211746

---
 src/chuankou/Sendmsg.java |  278 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 237 insertions(+), 41 deletions(-)

diff --git a/src/chuankou/Sendmsg.java b/src/chuankou/Sendmsg.java
index d97f1d8..79ace5c 100644
--- a/src/chuankou/Sendmsg.java
+++ b/src/chuankou/Sendmsg.java
@@ -1,21 +1,156 @@
 package chuankou;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.swing.SwingWorker;
+
+import chushihua.lunxun;
+import dialog.Charulog;
+import dialog.Dingshidialog;
+import dialog.Errlog;
+import publicway.OpenDoor;
+import xitongshezhi.SystemDebugDialog;
 
 /**
  * 涓插彛娑堟伅鍙戦�佸伐鍏风被
  * 鎻愪緵楂樻�ц兘鐨勪覆鍙f秷鎭彂閫佸姛鑳斤紝閫傚悎楂橀璋冪敤
+ * 浼樺寲鍐呭瓨浣跨敤锛岄伩鍏嶉暱鏃堕棿杩愯鍐呭瓨娉勬紡
  */
 public class Sendmsg {
     // 闈欐�佷覆鍙f湇鍔″疄渚�
     private static volatile SerialPortService serialService = null;
-    private static volatile boolean isPortOpen = false;
+    private static final AtomicBoolean isPortOpen = new AtomicBoolean(false);
     
-    // 璋冭瘯妯″紡寮�鍏�
-    private static final boolean DEBUG_MODE = false;
+    // 鏀逛负闈瀎inal锛屾敮鎸佸姩鎬佹帶鍒�
+    private static volatile boolean DEBUG_MODE = false;
     
-    // 鏃ユ湡鏍煎紡鍖�
-    private static final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss.SSS");
+    // 浣跨敤ThreadLocal淇濊瘉SimpleDateFormat绾跨▼瀹夊叏
+    private static final ThreadLocal<SimpleDateFormat> TIME_FORMATTER = 
+        ThreadLocal.withInitial(() -> new SimpleDateFormat("HH:mm:ss.SSS"));
+    
+    // 缂撳瓨瀛楃涓叉瀯寤哄櫒锛屽噺灏戝璞″垱寤�
+    private static final ThreadLocal<StringBuilder> STRING_BUILDER_CACHE = 
+        ThreadLocal.withInitial(() -> new StringBuilder(128));
+    
+    // 璁板綍娲昏穬鐨凷wingWorker锛屼究浜庣鐞�
+    private static final ConcurrentHashMap<String, SwingWorker<?, ?>> ACTIVE_WORKERS = 
+        new ConcurrentHashMap<>();
+   
+    
+    /**鍙戝崱鏈嶅姟鍣ㄦ帶鍒舵墦寮�鏌愪釜鏌滈棬璋冪敤鎸囦护
+     * @param int slotId鏌滈棬缂栧彿1-60
+     * @param int type 1鏄湇鍔″櫒鍙戝崱锛�2鏄鐞嗗憳鍙戝崱*/
+    public static boolean opendoorzhiling(int slotId,int type) {
+        lunxun.setSendChaxunzhiling(false);//鏆傚仠鏌ヨ鎸囦护
+        
+        try {
+            // 璋冪敤OpenDoor鐢熸垚寮�闂ㄦ寚浠�
+            String command = OpenDoor.openOneDoor(slotId, type);
+            boolean sendResult = Sendmsg.sendMessage(command);
+            
+            StringBuilder mesBuilder = STRING_BUILDER_CACHE.get();
+            mesBuilder.setLength(0); // 娓呯┖閲嶇敤
+            mesBuilder.append(command).append(";type").append(type).append("鎺у埗鎵撳紑").append(slotId).append("鏌滈棬");
+            String mes = mesBuilder.toString();
+            
+            Charulog.logOperation(mes);
+            if (lunxun.DEBUG_ENABLED) {
+                SystemDebugDialog.appendAsciiData(mes);
+            }
+            
+            return sendResult;
+        } finally {
+            // 纭繚鎭㈠鏌ヨ鎸囦护
+            lunxun.setSendChaxunzhiling(true);
+        }
+    }
+    
+    /**
+     * 鎵撳紑鍏ㄩ儴鍗℃Ы鐨勫叕鐢ㄩ潤鎬佹柟娉�
+     * @param type 鎿嶄綔绫诲瀷锛�1-鏈嶅姟鍣ㄥ彂鍗★紝2-绠$悊鍛樺彂鍗�
+     */
+    public static void openAllSlots(int type) {
+        lunxun.setSendChaxunzhiling(false);//鏆傚仠鏌ヨ鎸囦护
+        
+        String workerKey = "openAllSlots_" + System.currentTimeMillis();
+        
+        // 浣跨敤SwingWorker鍦ㄥ悗鍙版墽琛岋紝閬垮厤闃诲UI
+        SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
+            @Override
+            protected Void doInBackground() throws Exception {
+                // 閬嶅巻鎵�鏈夊崱妲斤紙1-60锛�
+                for (int slotId = 1; slotId <= 60 && !isCancelled(); slotId++) {
+                    try {
+                        // 鐢熸垚寮�闂ㄦ寚浠�
+                        String command = OpenDoor.openOneDoor(slotId, type);
+                        
+                        // 鍙戦�佷覆鍙f寚浠�
+                        boolean sent = Sendmsg.sendMessage(command);
+                        
+                        if (!sent) {
+                            Errlog.logOperation("鍙戦�佹寚浠ゅ埌鍗℃Ы " + slotId + " 澶辫触");
+                        }
+                        
+                        // 闂撮殧100ms锛屼絾妫�鏌ユ槸鍚﹁鍙栨秷
+                        Thread.sleep(100);
+                        
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
+                        break; // 琚腑鏂椂閫�鍑哄惊鐜�
+                    } catch (Exception e) {
+                        Errlog.logOperation("澶勭悊鍗℃Ы " + slotId + " 鏃跺彂鐢熼敊璇�: " + e.getMessage());
+                        // 缁х画澶勭悊涓嬩竴涓崱妲斤紝涓嶄腑鏂惊鐜�
+                    }
+                }
+                return null;
+            }
+            
+            @Override
+            protected void done() {
+                try {
+                    // 娓呯悊worker寮曠敤
+                    ACTIVE_WORKERS.remove(workerKey);
+                    
+                    // 鍙�夛細瀹屾垚鍚庡彲浠ユ坊鍔犲洖璋冨鐞�
+                    if (!isCancelled()) {
+                        StringBuilder messageBuilder = STRING_BUILDER_CACHE.get();
+                        messageBuilder.setLength(0);
+                        
+                        String types = "绠$悊鍛�";
+                        if(type == 1) {
+                            types = "鏈嶅姟鍣ㄦ寚浠�";
+                        }
+                        messageBuilder.append(types).append("宸插皢鍏ㄩ儴鍗℃Ы宸茬粡鎵撳紑璇峰彇鍗�");
+                        String message = messageBuilder.toString();
+                        
+                        Dingshidialog.showTimedDialog(null, 5, message);
+                        Charulog.logOperation(message);
+                    }
+                } finally {
+                    // 纭繚鎭㈠鏌ヨ鎸囦护
+                    lunxun.setSendChaxunzhiling(true);
+                }
+            }
+        };
+        
+        // 璁板綍worker渚夸簬绠$悊
+        ACTIVE_WORKERS.put(workerKey, worker);
+        worker.execute();
+    }
+    
+    /**
+     * 鍙栨秷鎵�鏈夋鍦ㄦ墽琛岀殑浠诲姟
+     */
+    public static void cancelAllTasks() {
+        ACTIVE_WORKERS.forEach((key, worker) -> {
+            if (!worker.isDone()) {
+                worker.cancel(true);
+            }
+        });
+        ACTIVE_WORKERS.clear();
+    }
     
     /**
      * 璁剧疆涓插彛鏈嶅姟瀹炰緥
@@ -24,7 +159,7 @@
      */
     public static void setSerialService(SerialPortService service, boolean open) {
         serialService = service;
-        isPortOpen = open;
+        isPortOpen.set(open);
     }
     
     /**
@@ -35,48 +170,69 @@
     }
     
     /**
-     * 鍙戦�佹秷鎭埌涓插彛
-     * @param message 瑕佸彂閫佺殑HEX鏍煎紡娑堟伅
-     * @return 鍙戦�佹垚鍔熻繑鍥瀟rue锛屽け璐ヨ繑鍥瀎alse
+     * 鍙戦�佹秷鎭埌涓插彛锛堝甫閲嶈瘯鏈哄埗锛�
      */
     public static boolean sendMessage(String message) {
-        if (!isPortOpen || serialService == null) {
-            if (DEBUG_MODE) {
-                System.err.println("[" + getCurrentTime() + "] 涓插彛鏈墦寮�锛屾棤娉曞彂閫佹暟鎹�");
-            }
+        if (!isPortOpen.get() || serialService == null) {
+            Errlog.logOperation("[" + getCurrentTime() + "] 涓插彛鏈墦寮�锛屾棤娉曞彂閫佹暟鎹�");
             return false;
         }
         
         if (message == null || message.trim().isEmpty()) {
-            if (DEBUG_MODE) {
-                System.err.println("[" + getCurrentTime() + "] 鍙戦�佹暟鎹负绌�");
-            }
+            Errlog.logOperation("[" + getCurrentTime() + "] 鍙戦�佹暟鎹负绌�");
             return false;
         }
         
         String text = message.trim();
+        int retryCount = 0;
+        final int MAX_RETRY = 2;
         
-        try {
-            // HEX鏍煎紡鍙戦��
-            byte[] data = hexStringToByteArray(text);
-            if (data != null && serialService.send(data)) {
-                // 楂橀璋冪敤鏃堕伩鍏嶉绻佺殑鏃ュ織杈撳嚭锛屽彧鍦ㄨ皟璇曟椂璁板綍
-                if (DEBUG_MODE) {
-                    System.out.println("[" + getCurrentTime() + "] 鍙戦��: " + text.toUpperCase());
+        while (retryCount <= MAX_RETRY) {
+            try {
+                byte[] data = hexStringToByteArray(text);
+                if (data == null) {
+                    Errlog.logOperation("[" + getCurrentTime() + "] HEX杞崲澶辫触锛屾暟鎹�: " + text);
+                    return false;
                 }
-                return true;
-            } else {
+                
+                boolean sendResult = serialService.send(data);
+                
+                if (sendResult) {
+                    if (DEBUG_MODE) {
+                        System.out.println("[" + getCurrentTime() + "] 鍙戦�佹垚鍔�: " + text.toUpperCase());
+                    }
+                    return true;
+                } else {
+                    retryCount++;
+                    if (retryCount <= MAX_RETRY) {
+                        Errlog.logOperation("[" + getCurrentTime() + "] 鍙戦�佸け璐ワ紝姝e湪閲嶈瘯 (" + retryCount + "/" + MAX_RETRY + ")");
+                        try {
+                            Thread.sleep(50); // 閲嶈瘯鍓嶇瓑寰�
+                        } catch (InterruptedException e) {
+                            Thread.currentThread().interrupt();
+                            break;
+                        }
+                    } else {
+                        if (DEBUG_MODE) {
+                            Errlog.logOperation("[" + getCurrentTime() + "] 涓插彛鍙戦�佸け璐ワ紝鎸囦护: " + text.toUpperCase());
+                            Errlog.logOperation("[" + getCurrentTime() + "] 涓插彛鐘舵�� - 鎵撳紑: " + isPortOpen.get() + ", 鏈嶅姟: " + (serialService != null));
+                            if (serialService != null) {
+                                Errlog.logOperation("[" + getCurrentTime() + "] 涓插彛鏈嶅姟鐘舵�� - 鏄惁鎵撳紑: " + serialService.isOpen());
+                            }
+                        }
+                        return false;
+                    }
+                }
+            } catch (Exception e) {
+                Errlog.logOperation("[" + getCurrentTime() + "] 鍙戦�佸紓甯革紝鎸囦护: " + text.toUpperCase());
                 if (DEBUG_MODE) {
-                    System.err.println("[" + getCurrentTime() + "] 鏁版嵁鍙戦�佸け璐�");
+                    e.printStackTrace();
                 }
                 return false;
             }
-        } catch (Exception e) {
-            if (DEBUG_MODE) {
-                System.err.println("[" + getCurrentTime() + "] 鏁版嵁鏍煎紡閿欒: " + e.getMessage());
-            }
-            return false;
         }
+        
+        return false;
     }
     
     /**
@@ -84,7 +240,11 @@
      * @return 涓插彛鎵撳紑鐘舵��
      */
     public static boolean isPortOpen() {
-        return isPortOpen && serialService != null;
+        boolean open = isPortOpen.get() && serialService != null;
+        if (!open && DEBUG_MODE) {
+            Errlog.logOperation("[" + getCurrentTime() + "] 涓插彛鐘舵�佹鏌�: 鏈墦寮�");
+        }
+        return open;
     }
     
     /**
@@ -100,7 +260,7 @@
         s = s.replaceAll("\\s+", ""); // 绉婚櫎绌烘牸
         int len = s.length();
         if (len % 2 != 0) {
-            throw new IllegalArgumentException("HEX瀛楃涓查暱搴﹀繀椤讳负鍋舵暟");
+            throw new IllegalArgumentException("HEX瀛楃涓查暱搴﹀繀椤讳负鍋舵暟锛屽綋鍓嶉暱搴�: " + len + ", 鏁版嵁: " + s);
         }
         
         byte[] data = new byte[len / 2];
@@ -109,7 +269,7 @@
             int low = Character.digit(s.charAt(i + 1), 16);
             
             if (high == -1 || low == -1) {
-                throw new IllegalArgumentException("鏃犳晥鐨凥EX瀛楃: " + s.charAt(i) + s.charAt(i + 1));
+                throw new IllegalArgumentException("鏃犳晥鐨凥EX瀛楃: '" + s.charAt(i) + s.charAt(i + 1) + "' 鍦ㄤ綅缃� " + i + "-" + (i+1) + ", 瀹屾暣鏁版嵁: " + s);
             }
             
             data[i / 2] = (byte) ((high << 4) + low);
@@ -127,7 +287,8 @@
             return "";
         }
         
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = STRING_BUILDER_CACHE.get();
+        sb.setLength(0);
         for (byte b : bytes) {
             sb.append(String.format("%02x", b));
         }
@@ -139,17 +300,52 @@
      * @return 鏃堕棿瀛楃涓�
      */
     private static String getCurrentTime() {
-        return timeFormat.format(new Date());
+        return TIME_FORMATTER.get().format(new Date());
     }
     
     /**
      * 鍚敤璋冭瘯妯″紡
-     * 娉ㄦ剰锛氳繖浼氫慨鏀归潤鎬乫inal鍙橀噺锛屽疄闄呴」鐩腑涓嶅缓璁繖鏍峰仛
-     * 杩欓噷鍙槸婕旂ず锛屽疄闄呭簲璇ラ�氳繃閰嶇疆鏂囦欢鎺у埗
      */
     public static void enableDebugMode() {
-        // 鍦ㄥ疄闄呴」鐩腑锛屽簲璇ヤ娇鐢ㄥ彲閰嶇疆鐨勬柟寮忚�屼笉鏄慨鏀筬inal鍙橀噺
-        // 杩欓噷鍙槸绀烘剰锛屽疄闄呬娇鐢ㄦ椂闇�瑕侀噸鏂拌璁�
-        System.out.println("璋冭瘯妯″紡宸插惎鐢�");
+        DEBUG_MODE = true;
+        System.out.println("[" + getCurrentTime() + "] Sendmsg璋冭瘯妯″紡宸插惎鐢�");
+    }
+    
+    /**
+     * 绂佺敤璋冭瘯妯″紡
+     */
+    public static void disableDebugMode() {
+        DEBUG_MODE = false;
+        System.out.println("[" + getCurrentTime() + "] Sendmsg璋冭瘯妯″紡宸茬鐢�");
+    }
+    
+    /**
+     * 璁剧疆璋冭瘯妯″紡
+     */
+    public static void setDebugMode(boolean debug) {
+        DEBUG_MODE = debug;
+        System.out.println("[" + getCurrentTime() + "] Sendmsg璋冭瘯妯″紡: " + (debug ? "鍚敤" : "绂佺敤"));
+    }
+    
+    /**
+     * 娓呯悊璧勬簮锛岄槻姝㈠唴瀛樻硠婕�
+     */
+    public static void cleanup() {
+        cancelAllTasks();
+        
+        // 娓呯悊ThreadLocal璧勬簮
+        TIME_FORMATTER.remove();
+        STRING_BUILDER_CACHE.remove();
+        
+        if (DEBUG_MODE) {
+            System.out.println("[" + getCurrentTime() + "] Sendmsg璧勬簮娓呯悊瀹屾垚");
+        }
+    }
+    
+    /**
+     * 鑾峰彇娲昏穬浠诲姟鏁伴噺
+     */
+    public static int getActiveTaskCount() {
+        return ACTIVE_WORKERS.size();
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3