如何在 Python 中正确地使用 QThread 类来进行多线程编程?
时间: 2024-12-24 09:33:04 浏览: 15
在 PyQt5 中,`QThread` 是用于在单独的线程中运行耗时任务的工具。以下是使用 `QThread` 进行多线程编程的基本步骤:
1. **创建线程**:
首先,你需要创建一个 `QThread` 实例,并将需要在新线程中运行的任务封装在一个独立的类里,这个类通常继承自 `QObject`。
```python
class WorkerSignals(QObject):
finished = pyqtSignal() # 定义信号
class Worker(QRunnable, QObject): # 继承自QRunnable和QObject
def __init__(self):
super().__init__()
self.signals = WorkerSignals()
def run(self):
# 这里放置你的耗时任务
result = some_expensive_computation()
self.signals.finished.emit(result) # 发出完成信号
```
2. **启动线程**:
使用 `QThread.start()` 来启动线程,并传递 `Worker` 对象作为参数。同时,连接 `WorkerSignals.finished` 信号到主线程的某个槽函数处理结果。
```python
worker = Worker()
thread = QThread()
worker.moveToThread(thread) # 将工作对象移到新线程
worker.signals.finished.connect(self.handle_result) # 连接信号
thread.started.connect(worker.run) # 当线程启动时运行工人
thread.start()
```
3. **处理结果**:
在主线程中定义一个槽函数(slot),当 `finished` 信号触发时,这个函数会被调用来处理计算的结果。
```python
def handle_result(result):
# 这里处理返回的结果
print(f"Received result: {result}")
```
4. **关闭线程**:
使用 `QThread.quit()` 或者 `QThread.exit()` 来结束线程,然后调用 `QThread.wait()` 来阻塞主线程,直到线程退出。
```python
thread.quit() # 或 thread.exit()
thread.wait() # 主线程阻塞在这里,直到线程退出
```
阅读全文