pyqt信号槽连接一个异步函数,这个函数需要长时间不停运行一个死循环,帮我写一个demo实现,要求不能出现程序闪退
时间: 2023-12-10 22:38:07 浏览: 124
异步编程demo
为了避免GUI界面卡死,我们可以将长时间运行的死循环放到一个单独的线程中运行,然后通过信号槽机制来通知GUI界面更新。
下面是一个简单的示例代码,其中`LongRunningTask`类表示需要长时间运行的任务,`TaskThread`类表示执行任务的线程,`MainWindow`类表示GUI界面,使用信号槽机制将线程和GUI界面连接起来。
```python
import sys
import time
from PyQt5.QtCore import QObject, pyqtSignal, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
class LongRunningTask(QObject):
finished = pyqtSignal()
def __init__(self):
super().__init__()
def run(self):
while True:
# 执行长时间运行的任务
time.sleep(1)
print('Task is running...')
class TaskThread(QThread):
def __init__(self, parent=None):
super().__init__(parent)
self.task = LongRunningTask()
def run(self):
self.task.run()
self.task.finished.emit()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.btn_start = QPushButton('Start', self)
self.btn_start.setGeometry(50, 50, 100, 30)
self.label_status = QLabel('Status: Not started', self)
self.label_status.setGeometry(50, 100, 200, 30)
self.btn_start.clicked.connect(self.start_task)
self.task_thread = TaskThread()
self.task_thread.task.finished.connect(self.task_finished)
def start_task(self):
self.label_status.setText('Status: Running')
self.task_thread.start()
def task_finished(self):
self.label_status.setText('Status: Finished')
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
```
在上面的代码中,我们使用了`QThread`来创建一个单独的线程,用于执行长时间运行的任务。在`TaskThread`中,我们创建一个`LongRunningTask`对象,然后调用它的`run`方法来执行长时间运行的任务。在`LongRunningTask`中,我们使用了一个死循环来模拟长时间运行的任务。
在GUI界面中,我们创建了一个`QPushButton`和一个`QLabel`,用于启动任务和显示任务状态。当用户点击`Start`按钮时,我们启动了`TaskThread`线程,并将`LongRunningTask`的`finished`信号与`task_finished`槽函数相连接,用于在任务完成时更新GUI界面。
阅读全文