进程与线程
- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在独立内存中运行
- 线程是一个轻负荷的子进程,是最小的处理单元。线程被包含在进程之中,是进程中的实际运作单位。一个进程可以并发多个线程,每条线程同时执行不同的任务,线程是独立的,一个线程发生错误,不影响其他线程正常执行。
多线程实现
界面类文件
界面文件有 .ui
文件生成,无需进行修改,在逻辑类文件中继承并进行逻辑修改即可
线程类文件
根据任务需求编写线程类文件,其构造大致如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from PySide6.QtCore import QThread, Signal
class DetectionThread(QThread): graph_signal = Signal(str)
def __init__(self, temp = None): super().__init__() self._running = True self.temp = temp
def run(self): while self._running: print(self.temp)
def stop(self): self._running = False
|
其中的graph_signal = Signal(str)
为自定义信号的声明 str可以更换为要传递的任何信号类别
run()
为线程的执行函数,线程开始后讲执行该函数
逻辑类文件
一个简易的结构如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import sys from PySide6.QtWidgets import QMainWindow, QApplication
from main_window_ui import Ui_MainWindow from thread.thread import DetectionThread
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.bind_shots()
def start_thread(self): print("Tread Start!") self.detection_thread = DetectionThread() self.detection_thread.oringraph.connect(self.Work) self.detection_thread.start()
def Work(self, msg): print(msg)
def stop_thread(self): self.detection_thread.terminate()
def bind_shots(self): self.start.clicked.connect(self.start_thread) self.stop.clicked.connect(self.stop_thread)
if __name__ == "__main__": app = QApplication(sys.argv)
window = MainWindow() window.show()
app.exec_()
|
运行后可通过案件触发开启、关闭线程
注意,若不做进一步处理,即使在运行后通过界面右上角关闭窗口,线程仍会处以开启状态