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("程序终止")

posted on 2025-04-29 15:26  泰勒幂级数  阅读(16)  评论(0)    收藏  举报