📜  执行 cpu 密集型任务时,如何保持 pyqt GUI 响应? - Python (1)

📅  最后修改于: 2023-12-03 14:54:32.087000             🧑  作者: Mango

执行 CPU 密集型任务时,如何保持 PyQt GUI 响应?

在 PyQt GUI 应用程序中,当执行 CPU 密集型任务时,如果没有特殊处理,GUI 界面将会被阻塞,直到任务执行完毕。这会让界面变得不友好,用户体验会大大降低。为了避免这种情况,以下是一些保持 PyQt GUI 响应的方法:

使用多线程或多进程

将 CPU 密集型任务放在一个单独的线程或进程中执行,这样可以避免主 GUI 线程被阻塞。在 PyQt 中,可以使用 QThread 或 multiprocessing 模块来实现多线程或多进程。

以下是使用 QThread 实现多线程的示例代码:

from PyQt5.QtCore import QThread

class MyTask(QThread):
    def __init__(self):
        super().__init__()
    
    def run(self):
        # 执行 CPU 密集型任务

以下是使用 multiprocessing 实现多进程的示例代码:

from multiprocessing import Process

class MyTask(Process):
    def __init__(self):
        super().__init__()
    
    def run(self):
        # 执行 CPU 密集型任务
使用 QTimer 来定时更新 GUI

在执行 CPU 密集型任务时,使用 QTimer 来定时更新 GUI,这样可以保持界面的响应性。在 QTimer 的 timeout 信号中更新 GUI。

以下是使用 QTimer 的示例代码:

from PyQt5.QtCore import QTimer

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_gui)
    
    def start_task(self):
        self.timer.start(100)  # 每 100ms 更新一次 GUI
        # 执行 CPU 密集型任务
    
    def update_gui(self):
        # 更新 GUI 
使用 QThreadPool 实现多线程并发执行任务

QThreadPool 是 PyQt 提供的一个线程池类,可以用来管理多个线程任务的并发执行。在执行 CPU 密集型任务时,将任务提交到 QThreadPool 中执行,这样可以避免主 GUI 线程被阻塞,并发执行任务可以提高任务执行效率。

以下是使用 QThreadPool 实现多线程并发执行任务的示例代码:

from PyQt5.QtCore import QThreadPool, QRunnable

class MyTask(QRunnable):
    def run(self):
        # 执行 CPU 密集型任务

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.threadpool = QThreadPool()
    
    def start_task(self):
        task = MyTask()
        self.threadpool.start(task)

以上是保持 PyQt GUI 响应的方法,选择适合自己应用场景的方法来实现,可以提高 GUI 界面的响应性和用户体验。