python类、线程、定时、信号量、窗体简单构建
线程
import threading
print("# 启动串口线程")
serial_worker = threading.Thread(target=new_def_function, daemon=True)
serial_worker.start()
线程阻塞
import threading
import time
print("# 创建一个信号量对象,允许同时有 2 个线程访问资源")
semaphore = threading.Semaphore(1)
print("# 定义一个函数作为线程的执行体")
def worker_thread(name):
while(True):
print(f"{name} 线程正在等待获取信号量...")
semaphore.acquire()
try:
print(f"{name} 线程已获取信号量,开始执行")
time.sleep(2) # 模拟耗时操作
print(f"{name} 线程执行完毕,释放信号量\n")
finally:
semaphore.release()
serial_worker = threading.Thread(target=worker_thread,args=(f"线程",), daemon=True)
serial_worker.start()
while(True):
semaphore.acquire()
print("主函数while")
time.sleep(1)
print("主函数whileOK\n")
# # 释放两次信号量,相当于喂两次狗
# semaphore.release()
semaphore.release()
time.sleep(0.1)
通过 ** semaphore = threading.Semaphore(1) **初值和 ** semaphore.acquire()、semaphore.release() 实现,也可以,通过 ** event = threading.Event() 和 ** event.set() **,以及 ** event.wait()、event.clear() **实现。
# 创建一个事件对象,用于线程间的同步
event = threading.Event()
def worker_thread(name):
while True:
print(f"--{name} 线程正在等待喂狗...")
# 等待事件被设置
event.wait()
# 事件被设置后,重置事件
event.clear()
try:
print(f"{name} 线程开始执行")
while True:
# 设置事件,通知子线程可以执行
event.set()
if event_begin.is_set():
print("event_begin 已被设置,主程序继续执行")
print("==主函数喂狗\n")
线程_定时器
def repeatead_timer(interval, function, *args, **kwargs):
stopped = threading.Event()
def loop():
while not stopped.wait(interval):
function(*args, **kwargs)
threading.Thread(target = loop).start()
return stopped
timer_stopped = repeatead_timer(0.5, window.myhandle) 类中函数
窗体
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QComboBox, QVBoxLayout, QWidget, QLineEdit, QHBoxLayout
from PyQt5.QtWidgets import QSpacerItem, QTextEdit
class SerialReader(QMainWindow):# 2. 主窗口类定义 - SerialReader1
def __init__(self):
super().__init__()
self.init_ui()# 2.1 界面初始化 - init_ui
self.connect_signals()
def init_ui(self):
self.setWindowTitle("串口数据读取 - 经纬度显示")
print("# 查找可用串口并添加到下拉框")
port_names = ["1","2","3","4"] # ports = list_ports.comports(); [port.device for port in ports]
self.serial_port_combobox_s1 = QComboBox(self)
self.serial_port_combobox_s1.addItems(port_names)
left_layout = QVBoxLayout()
port_layout = QHBoxLayout()
port_layout.addWidget(QLabel("串口_S1:"))
port_layout.addWidget(self.serial_port_combobox_s1)
left_layout.addLayout(port_layout)
main_layout = QHBoxLayout()
main_layout.addLayout(left_layout)
spacer = QSpacerItem(20, 20 * 3)
main_layout.addItem(spacer)
central_widget = QWidget()
central_widget.setLayout(main_layout)
self.setCentralWidget(central_widget)
def add_data(self): # self.
self.update_plot(100)
def update_plot(self,f):
pass
def connect_signals(self):
self.serial_port_combobox_s1.currentIndexChanged.connect(self.toggle_serial_reading)
def toggle_serial_reading(self):
print("hello")
import sys
if __name__ == "__main__":
try:
app = QApplication(sys.argv)
window = SerialReader()
window.show()
sys.exit(app.exec_())
except KeyboardInterrupt:
print("程序终止")
浙公网安备 33010602011771号