PyQt5学习笔记15----PyQt 线程相关类

原创 2015年04月23日 19:09:44
         QThread是我们将要详细介绍的第一个类。它也是 Qt 线程类中最核心的底层类。由于 PyQt 的跨平台特性,QThread要隐藏掉所有平台相关的代码。


         正如前面所说,要使用QThread开始一个线程,我们可以创建它的一个子类,然后覆盖其QThread.run()函数:

class Thread(QThread):
    def __init__(self):
        super(Thread,self).__init__()
    def run(self):
        pass               #线程相关代码

         然后我们这样新建一个新的线程

thread=Thread()
thread.start()
        这个默认实现其实是简单地调用了QThread.exec()函数,而这个函数,按照我们前面所说的,其实是开始了一个事件循环
       QRunnable是我们要介绍的第二个类。这是一个轻量级的抽象类,用于开始一个另外线程的任务。这种任务是运行过后就丢弃的。由于这个类是抽象类,我们需要继承QRunnable,然后重写其纯虚函数QRunnable.run():

class Task(QRunnable):
    def __init__(self):
        super(QRunnable,self).__init__()
    def run(self):
        pass               #线程相关代码
        要真正执行一个QRunnable对象,我们需要使用QThreadPool类。顾名思义,这个类用于管理一个线程池。通过调用QThreadPool.start(runnable)函数,我们将一个QRunnable对象放入QThreadPool的执行队列。一旦有线程可用,线程池将会选择一个QRunnable对象,然后在那个线程开始执行。所有 PyQt 应用程序都有一个全局线程池,我们可以使用QThreadPool.globalInstance()获得这个全局线程池;与此同时,我们也可以自己创建私有的线程池,并进行手动管理。

task=Task()
QThreadPool.globalInstance().start(task)
        需要注意的是,QRunnable不是一个QObject,因此也就没有内建的与其它组件交互的机制。为了与其它组件进行交互,你必须自己编写低级线程原语,例如使用 mutex 守护来获取结果等。


       QtConcurrent是我们要介绍的最后一个对象。这是一个高级 API,构建于QThreadPool之上,用于处理大多数通用的并行计算模式:map、reduce 以及 filter。它还提供了QtConcurrent.run()函数,用于在另外的线程运行一个函数。注意,QtConcurrent是一个命名空间而不是一个类,因此其中的所有函数都是命名空间内的全局函数。


       不同于QThread和QRunnable,QtConcurrent不要求我们使用低级同步原语:所有的QtConcurrent都返回一个QFuture对象。这个对象可以用来查询当前的运算状态(也就是任务的进度),可以用来暂停/回复/取消任务,当然也可以用来获得运算结果。注意,并不是所有的QFuture对象都支持暂停或取消的操作。比如,由QtConcurrent.run()返回的QFuture对象不能取消,但是由QtConcurrent.mappedReduced()返回的是可以的。QFutureWatcher类则用来监视QFuture的进度,我们可以用信号槽与QFutureWatcher进行交互(注意,QFuture也没有继承QObject)。


下面我们可以对比一下上面介绍过的三种类:
特性 QThread QRunnable QtConcurrent
高级 API
面向任务
内建对暂停/恢复/取消的支持
具有优先级
可运行事件循环

PyQt5学习笔记14----初识pyqt多线程操作

我们的主界面有一个用于显示时间的 LCD 数字面板还有一个用于启动任务的按钮。程序的目的是用户点击按钮,开始一个非常耗时的运算(程序中我们以一个 2000000000 次的循环来替代这个非常耗时的工作...

PyQt5学习笔记13----pyqt线程间通信

信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实信号槽类似于.NET里面的委托、事件,比如Repeater控件类...

Python3-PyQt5-UI线程与工作线程分离

工作线程与UI线程的分离 首先先介绍QThread这个类,它是PyQt中用于实现多线程的类,以下代码展示如何使用。 #_*_coding:utf-8_*_ from PyQt5.QtCore impo...

PyQt5的多线程

我写了一个桌面软件,UI用的PyQt5,内容是爬虫。 作为一个新手,写完这个软件之后,对于多线程的应用有了一个提升。 最开始只用了一个线程(结果当然是卡死,OS强制退出),这唯一的线程又干...

python3多线程更新UI数据,pyqt5界面刷新

本程序python3,pyqt5环境下。在编写界面程序的时候经常会执行一些耗时的操作,所以我们要使用多线程来做耗时任务,主线程用来重绘界面。而子线程里边的实时处理结果需要反馈到界面。而总所周知,子线程...

PyQt 分离UI主线程与工作线程

本文主要用于入门PyQt的多线程操作,包括传参数和有返回值的多线程,用到了Qt的信号和槽。有简单又具体的代码作例子用于讲解。...
  • Mr_Zing
  • Mr_Zing
  • 2015年07月18日 19:49
  • 9700

多线程的几种实现方法详解

随着计算机技术的发展,编程模型也越来越复杂多样化。但多线程编程模型是目前计算机系统架构的最终模型。随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最高为4G。事实上目前3....
  • jspamd
  • jspamd
  • 2010年01月27日 20:02
  • 67125

pyqt signal slot thread 多线程

 目录(?)[+]         信号(singal)与槽(slot)用于对象相互通信,信号:当某个对象的某个事件发生时,触发一个信号,槽:响应指定信号的所做的反应,其实...

PyQt5 学习笔记

1、初探Qt Designer 设计师 打开PyQt5的Qt Designer,会自动弹出新建窗体对话框,对于我们最常用的就是Widget通用窗口类,还有个MainWindows顾名思义主窗...
  • zd0303
  • zd0303
  • 2015年12月11日 11:20
  • 26802

QThread 使用探讨

QThread 使用探讨 2010-10-23 00:30 注意:本文停止更新,请优先考虑 Qt 线程基础(QThread、QtConcurrent等) dbzh...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PyQt5学习笔记15----PyQt 线程相关类
举报原因:
原因补充:

(最多只允许输入30个字)