deepseek优化后的版本2

This commit is contained in:
2025-09-29 09:35:25 +08:00
parent a42f54a5b0
commit bae35d18fc

View File

@@ -6,10 +6,12 @@ import json
import string import string
import serial import serial
import serial.tools.list_ports import serial.tools.list_ports
import tkinter import tkinter
import tkgen.gengui
import tkinter.scrolledtext import tkinter.scrolledtext
import tkinter.filedialog import tkinter.filedialog
import tkgen.gengui
import threading import threading
import time import time
import datetime import datetime
@@ -331,6 +333,7 @@ class SerialCommunicator:
self.com = serial.Serial() self.com = serial.Serial()
self.threads = [] self.threads = []
self.running = threading.Event() self.running = threading.Event()
self.data_ready = threading.Event() # 用于发送线程
self.shutdown_event = threading.Event() self.shutdown_event = threading.Event()
# 统计信息 # 统计信息
@@ -411,13 +414,14 @@ class SerialCommunicator:
"""启动通信线程""" """启动通信线程"""
self.running.set() self.running.set()
self.shutdown_event.clear() self.shutdown_event.clear()
self.data_ready.clear()
# 启动接收线程 # 启动接收线程
recv_thread = threading.Thread(target=self._receive_loop, daemon=True) recv_thread = threading.Thread(target=self._receive_loop, daemon=True)
recv_thread.start() recv_thread.start()
self.threads.append(recv_thread) self.threads.append(recv_thread)
# 启动发送线程(如果需要循环发送) # 启动发送线程
send_thread = threading.Thread(target=self._send_loop, daemon=True) send_thread = threading.Thread(target=self._send_loop, daemon=True)
send_thread.start() send_thread.start()
self.threads.append(send_thread) self.threads.append(send_thread)
@@ -426,6 +430,7 @@ class SerialCommunicator:
"""停止通信线程""" """停止通信线程"""
self.running.clear() self.running.clear()
self.shutdown_event.set() self.shutdown_event.set()
self.data_ready.set() # 唤醒发送线程
# 等待线程结束 # 等待线程结束
for thread in self.threads[:]: for thread in self.threads[:]:
@@ -451,25 +456,37 @@ class SerialCommunicator:
self.ui.log(f'{self.com.port}: 接收 {len(buffer)} 字节') self.ui.log(f'{self.com.port}: 接收 {len(buffer)} 字节')
buffer = b'' buffer = b''
time.sleep(0.01) # 减少CPU占用 # 使用 Event.wait 代替 sleep可以及时响应停止事件
self.running.wait(0.01) # 等待10ms或直到running被清除
except Exception as e: except Exception as e:
logger.error(f"接收数据错误: {e}") logger.error(f"接收数据错误: {e}")
time.sleep(0.1) # 出错时等待100ms但可以响应停止事件
self.running.wait(0.1)
def _send_loop(self): def _send_loop(self):
"""发送数据循环""" """发送数据循环"""
while self.running.is_set(): while self.running.is_set():
try: try:
if self.com.is_open and self.ui.should_send_cycle(): if self.com.is_open and self.ui.should_send_cycle():
time.sleep(self.ui.get_cycle_interval()) cycle_interval = self.ui.get_cycle_interval()
self._send_data()
# 使用 Event.wait 代替 sleep可以及时响应停止事件
# 等待指定的间隔时间如果在此期间running被清除则立即退出
if not self.running.wait(cycle_interval):
# 如果等待超时返回False说明running仍然设置可以发送数据
self._send_data()
# 如果wait返回True说明running被清除循环条件会失败退出循环
else: else:
time.sleep(0.1) # 等待数据准备好或停止事件最多等待100ms
self.data_ready.wait(0.1)
if self.data_ready.is_set():
self._send_data()
self.data_ready.clear()
except Exception as e: except Exception as e:
logger.error(f"发送循环错误: {e}") logger.error(f"发送循环错误: {e}")
time.sleep(0.1) self.running.wait(0.1) # 出错时等待,但可以响应停止事件
def send_data(self): def send_data(self):
"""发送数据""" """发送数据"""
@@ -477,9 +494,8 @@ class SerialCommunicator:
self.ui.log('串口未打开') self.ui.log('串口未打开')
return return
thread = threading.Thread(target=self._send_data, daemon=True) # 设置数据准备事件,唤醒发送线程
thread.start() self.data_ready.set()
self.threads.append(thread)
def _send_data(self): def _send_data(self):
"""实际发送数据""" """实际发送数据"""
@@ -522,6 +538,7 @@ class SerialCommunicator:
# 停止所有线程 # 停止所有线程
self.running.clear() self.running.clear()
self.shutdown_event.set() self.shutdown_event.set()
self.data_ready.set() # 唤醒可能等待的发送线程
# 关闭串口 # 关闭串口
if self.com.is_open: if self.com.is_open:
@@ -532,7 +549,7 @@ class SerialCommunicator:
logger.error(f"关闭串口时出错: {e}") logger.error(f"关闭串口时出错: {e}")
# 等待一段时间让线程结束 # 等待一段时间让线程结束
time.sleep(0.5) self.shutdown_event.wait(1.0)
# 强制退出 # 强制退出
sys.exit(0) sys.exit(0)
@@ -681,10 +698,7 @@ class TopWindow:
def main(): def main():
"""主函数""" """主函数"""
#try: try:
if True:
# 导入UI生成库
# 创建主窗口 # 创建主窗口
tkinter.ScrolledText = tkinter.scrolledtext.ScrolledText tkinter.ScrolledText = tkinter.scrolledtext.ScrolledText
root = tkgen.gengui.TkJson('app.ui', title='scomm串口调试助手') root = tkgen.gengui.TkJson('app.ui', title='scomm串口调试助手')
@@ -725,8 +739,7 @@ def main():
logger.info("应用程序启动完成") logger.info("应用程序启动完成")
root.mainloop() root.mainloop()
#except Exception as e: except Exception as e:
else:
logger.error(f"应用程序启动失败: {e}") logger.error(f"应用程序启动失败: {e}")
sys.exit(1) sys.exit(1)