基于QThread的多线程任务管理

基于QThread的多线程任务管理

开发背景

在开发一个 PyQt 应用程序时,我们经常需要执行一些耗时的操作,例如文件读写网络请求复杂的数据处理长时间的计算。如果这些操作在主线程中执行,会导致用户界面(UI)冻结,用户无法与应用程序进行交互,影响用户体验。为了解决这个问题,我们需要将这些耗时操作放在单独的线程中执行。

然而,直接使用多线程会带来一些复杂性,例如线程的创建管理信号槽机制的使用,以及在多线程环境下处理异常和结果的传递等。为了简化这些操作,因此开发了 TaskTaskManager 类。

功能实现

方法解释

  • 线程执行Task 类继承自 QThread,它的主要目的是将一个函数封装在一个单独的线程中执行。这样,我们可以将耗时的操作封装在 Task 类的 func 方法中,通过调用 start() 方法将其在后台线程中运行,避免阻塞主线程。
  • 信号机制:使用 PyQt 的 pyqtSignal 机制,Task 类定义了三个信号:
    • success_signal:当任务成功完成时发送信号。
    • fail_signal:当任务执行过程中出现异常时发送信号。
    • finished_signal:当任务完成(无论成功还是失败)时发送信号。
  • 回调函数连接onSuccessonFailonFinished 方法允许我们方便地将相应的回调函数连接到这些信号上。例如,我们可以在任务成功时更新 UI 元素,在任务失败时显示错误消息,在任务完成时执行清理操作等。
  • 任务生命周期管理
    • create_task 方法允许我们创建新的任务,并将其添加到 _tasks 字典中。
    • run_task 方法用于启动一个任务,并在任务完成时调用 remove_task 方法将其从 _tasks 中移除,确保任务列表的及时更新。
    • run_tasks 方法可以同时运行多个任务。
    • remove_task 方法确保任务完成后从任务列表中移除,避免内存泄漏和任务状态混乱。
    • is_idleis_all_idle 方法用于检查任务是否处于空闲状态。

使用示例

python
def getDeviceInfo():
    # 一些耗时操作...
    return "模拟设备数据"

task = TaskManager.create_task(getDeviceInfo).onSuccess(lambda deviceInfo: print(deviceInfo)).onFail(lambda e: print(e)).onFinished(lambda: print("任务结束"))
TaskManager.run_task(task)
链式调用shell指令
python常用代码片段

评论区

评论加载中...