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
面向任务
内建对暂停/恢复/取消的支持
具有优先级
可运行事件循环

版权声明:本文为博主原创文章,未经博主允许不得转载。

PyQt4--QThread实现界面与算法的分离--2

PyQt4实时显示的另一种实现方式 # -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import...
  • adream307
  • adream307
  • 2011年04月08日 13:40
  • 5602

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

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

pyqt通过信号槽机制来退出线程

刚刚解决了pyqt线程退出问题,特来此记录下解决的想法。以下用一个简单例子来表现如何用signal/slot信号槽来退出线程。 若有一个按钮,点击开始线程,再次点击退出线程,线程的工作为打印a(1-2...
  • parkour_
  • parkour_
  • 2015年05月26日 15:44
  • 2946

PyQt4--QThread实现界面与算法的分离--2

#!/usr/local/bin/python #-*- coding: UTF-8 -*- #coding : gbk # -*- coding: utf-8 -*- from PyQt4.QtC...
  • webxscan
  • webxscan
  • 2016年04月28日 10:25
  • 507

PyQt4--QThread实现界面与算法分离

http://www.diotavelli.net/PyQtWiki/Threading%2C_Signals_and_Slots import math, random, sys f...
  • adream307
  • adream307
  • 2011年04月08日 13:37
  • 4632

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

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

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

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

Qt 线程基础(QThread、QtConcurrent等)

昨晚看Qt的Manual,突然发现下一个版本的Qt中(Qt4.7.4、Qt4.8等)增加了一个特赞的介绍多线程的文章 :Thread Basics注意:该链接以后会失效,但是 到时候你直接看Qt自带M...
  • dbzhang800
  • dbzhang800
  • 2011年06月18日 23:02
  • 54264

经常看到有人问在PyQt里面如何做长操作的时候更新GUI。我自己总结了几种方案,以及他们的适用场合:

经常看到有人问在PyQt里面如何做长操作的时候更新GUI。我自己总结了几种方案,以及他们的适用场合:  一是使用processEvents(),适合每次处理时间短的情况,缺点是CPU占用可能很大...
  • pi9nc
  • pi9nc
  • 2013年11月19日 10:55
  • 7109

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

工作线程与UI线程的分离 首先先介绍QThread这个类,它是PyQt中用于实现多线程的类,以下代码展示如何使用。 #_*_coding:utf-8_*_ from PyQt5.QtCore impo...
  • weixin_38125866
  • weixin_38125866
  • 2017年08月09日 22:54
  • 1235
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PyQt5学习笔记15----PyQt 线程相关类
举报原因:
原因补充:

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