在上周,使用PyQT5制作了一个串口工具,但是长时间运行时,发现会出现卡顿情况,因此,今天着手采用多线程,进行重新调整,目前窗口打开速度明显提升。其余改动在后续逐步完成。
import configparser
import time
import datetime
from PyQt5 import QtWidgets
from PyQt5.QtGui import QTextCursor
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
import os
from uartToolWindow import Ui_Form
from PyQt5.QtCore import QTimer,QObject,pyqtSignal,QThread
import crc
import re
from uart_tool_thread import UartToolThreadClass
class uart_window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
self.windowInit()
self.cfg_init()
self.connectInit()
self.tool_thread = UartToolThreadClass()
self.child_thread = QThread()
self.tool_thread.moveToThread(self.child_thread)
self.child_thread.start()
self.tool_thread.startSignal.connect(self.tool_thread.toolInit)
self.tool_thread.startSignal.emit()
self.tool_thread.openComSignal.connect(self.tool_thread.openCom)
self.tool_thread.offComSignal.connect(self.tool_thread.offCom)
self.tool_thread.sendSignal.connect(self.tool_thread.sendData)
self.tool_thread.errSignal.connect(self.windowTs)
self.tool_thread.showOffUartSignal.connect(self.openButtonShowChange)
self.tool_thread.showRevDataSignal.connect(self.receive_data)
self.tool_thread.showTimeSignal.connect(self.timeFlush)
# self.tool_thread.showComSignal.connect(self.tool_thread.tsearchCom)
self.tool_thread.loop_send_timer.timeout.connect(self.send_Data)
self.tool_thread.tool_receive_timer.timeout.connect(self.receive_data)
self.tool_thread.find_com_timer.timeout.connect(self.searchCom)
def windowTs(self,item):
QMessageBox.critical(item)
return None
def openButtonShowChange(self,item):
self.ui.pushButton_open.setText(item)
def loop_send(self):
if self.ui.checkBox_Sendinterval.isChecked():
if self.ui.textEdit.toPlainText() == "":
QMessageBox.critical(self, "提示", '发送内容为空!')
self.ui.checkBox_Sendinterval.setChecked(False)
return None
else:
if self.ui.lineEdit_intervalValue.text() == "":
QMessageBox.critical(self,"提示",'请填入发送间隔,单位为毫秒!')
return None
else:
self.ui.pushButton_4.setEnabled(False)
intv = int(self.ui.lineEdit_intervalValue.text())
if self.ui.lineEdit_intervalValue.text().isdigit() and intv > 0:
self.loop_send_timer.start(intv)
else:
QMessageBox.critical(self,'提示',"正确的阿拉伯数字")
return None
else:
self.ui.pushButton_4.setEnabled(True)
self.loop_send_timer.stop()
def receive_data(self,item):
timeFontFormat = '<font color="red" size="2">{}</font>'
contentFontFormat = '<font color="black" size="2">{}</font>'
data = item
num = len(data)
self.ui.textBrowser_Ellis.append(f"接收:{num}个数据")
self.ui.textBrowser_Ellis.moveCursor(QTextCursor.End)
rev_string = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
self.ui.textBrowserRev.append("\n")
self.ui.textBrowserRev.append(timeFontFormat.format(rev_string+":"))
if self.ui.checkBox_hexShow.isChecked():
rev = ""
for i in range(0,len(data)):
rev= rev +"收 " + '{:02X}'.format(data[i]) + " "
self.ui.textBrowserRev.append(contentFontFormat.format(rev))
self.ui.textBrowserRev.moveCursor(QTextCursor.End)
else :
try:
rev_data = data.decode("utf-8")
except :
QMessageBox.critical(self,"提示",'请选择正确波特率!')
self.ui.pushButton_open.setText('打开串口')
self.tool_receive_timer.stop()
self.serialTool.close()
return None
else:
self.ui.textBrowserRev.append(contentFontFormat.format("收: "+ rev_data))
self.ui.textBrowserRev.moveCursor(QTextCursor.End)
def timeFlush(self):
current_time