Pyside6多线程

CGC Lv4

进程与线程

  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在独立内存中运行
  • 线程是一个轻负荷的子进程,是最小的处理单元。线程被包含在进程之中,是进程中的实际运作单位。一个进程可以并发多个线程,每条线程同时执行不同的任务,线程是独立的,一个线程发生错误,不影响其他线程正常执行。

多线程实现

界面类文件

界面文件有 .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

#run函数是子线程中的操作,线程启动后开始执行
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

# 引入UI文件与线程文件
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) # 将线程中的信号与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_()

运行后可通过案件触发开启、关闭线程
注意,若不做进一步处理,即使在运行后通过界面右上角关闭窗口,线程仍会处以开启状态

  • Title: Pyside6多线程
  • Author: CGC
  • Created at: 2023-10-19 15:09:39
  • Updated at: 2023-10-19 15:37:29
  • Link: https://redefine.ohevan.com/2023/10/19/Pyside6多线程/
  • License: This work is licensed under CC BY-NC-SA 4.0.