使用pyside6实现一个简单的线程池连接,需要并行处理两个不同的任务,并带有ui窗口展示
时间: 2023-05-11 08:01:58 浏览: 320
解决PySide+Python子线程更新UI线程的问题
好的,我可以回答这个问题。您可以使用QThreadPool类来实现一个简单的线程池连接。您需要创建一个QRunnable类的子类来表示每个任务,并在run()方法中实现任务的逻辑。然后,您可以使用QThreadPool的start()方法来启动每个任务。在UI窗口中,您可以使用QProgressBar来显示任务的进度,并使用QLabel来显示任务的状态。以下是一个示例代码:
```python
from PySide6.QtCore import QRunnable, QObject, QThreadPool, Signal
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QProgressBar
import time
class Task1(QRunnable):
def __init__(self):
super().__init__()
def run(self):
for i in range(1, 101):
time.sleep(0.1)
self.progress.emit(i)
self.finished.emit("Task 1 completed")
progress = Signal(int)
finished = Signal(str)
class Task2(QRunnable):
def __init__(self):
super().__init__()
def run(self):
for i in range(1, 101):
time.sleep(0.1)
self.progress.emit(i)
self.finished.emit("Task 2 completed")
progress = Signal(int)
finished = Signal(str)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("线程池连接示例")
self.setGeometry(100, 100, 400, 200)
self.label1 = QLabel("任务1:等待中", self)
self.label1.move(50, 50)
self.progress1 = QProgressBar(self)
self.progress1.setGeometry(50, 80, 300, 20)
self.label2 = QLabel("任务2:等待中", self)
self.label2.move(50, 110)
self.progress2 = QProgressBar(self)
self.progress2.setGeometry(50, 140, 300, 20)
self.threadpool = QThreadPool()
task1 = Task1()
task1.progress.connect(self.progress1.setValue)
task1.finished.connect(self.label1.setText)
self.threadpool.start(task1)
task2 = Task2()
task2.progress.connect(self.progress2.setValue)
task2.finished.connect(self.label2.setText)
self.threadpool.start(task2)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
这个示例代码中,我们创建了两个任务类Task1和Task2,它们分别表示两个不同的任务。在run()方法中,我们模拟了一个耗时的任务,并使用progress信号来更新进度条,使用finished信号来更新任务状态。在MainWindow类中,我们创建了两个QLabel和两个QProgressBar来显示任务的状态和进度。我们还创建了一个QThreadPool对象来管理线程池连接,并使用start()方法来启动每个任务。最后,我们使用QApplication来启动应用程序并显示UI窗口。
阅读全文