美文网首页Python
pyqt5教程(十一)多线程防阻塞

pyqt5教程(十一)多线程防阻塞

作者: 交易狗二哈 | 来源:发表于2017-05-20 21:23 被阅读553次

一、

当我们设计的界面在处理比较长时间的任务时,就会出现阻塞,出现程序未响应,导致程序停止的情况,例如这个百度图片下载器
所以我们应把主线程与工作线程分离,以免主循环阻塞,造成程序停止响应

二、例子

from PyQt5.QtCore import *  
from PyQt5.QtGui import *  
from PyQt5.QtWidgets import *
import sys

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.t = 0

        window = QWidget()
        vbox = QVBoxLayout(window)
        #vbox = QVBoxLayout(window)

        lcdNumber = QLCDNumber()
        button = QPushButton("测试")
        vbox.addWidget(lcdNumber)
        vbox.addWidget(button)

        self.timer = QTimer()
        
        button.clicked.connect(self.work)
        self.timer.timeout.connect(self.setTime)

        self.setLayout(vbox)
        self.show()

    def setTime(self):
        self.t += 1
        self.lcdNumber.display(self.t)

    def work(self):
        self.timer.start(10000)
        for i in range(200000000):
            pass
        self.timer.stop()
        
        
if __name__ == "__main__":        
    app = QApplication(sys.argv)
    th = Example()
    sys.exit(app.exec_())

运行这个程序,当我们点击测试,进行较长时间的任务时,程序就无法选中了,最终停止运行。

三、多线程

下面用多线写法解决该问题

from PyQt5.QtCore import *  
from PyQt5.QtGui import *  
from PyQt5.QtWidgets import *
import sys

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.t = 0

        window = QWidget()
        vbox = QVBoxLayout(window)
        #vbox = QVBoxLayout(window)

        self.lcdNumber = QLCDNumber()
        button = QPushButton("测试")
        vbox.addWidget(self.lcdNumber)
        vbox.addWidget(button)

        self.timer = QTimer()
        
        button.clicked.connect(self.Work)
        self.timer.timeout.connect(self.CountTime)

        self.setLayout(vbox)
        self.show()

    def CountTime(self):
        self.t += 1
        self.lcdNumber.display(self.t)

    def Work(self):
        self.timer.start(1000)
        self.thread = RunThread()
        self.thread.start()
        self.thread.trigger.connect(self.TimeStop)

    def TimeStop(self):
        self.timer.stop()
        print("运行结束用时",self.lcdNumber.value())
        self.t = 0
        

class RunThread(QThread):
    # python3,pyqt5与之前的版本有些不一样
    #  通过类成员对象定义信号对象
    # _signal = pyqtSignal(str)

    trigger = pyqtSignal()
 
    def __init__(self, parent=None):
        super(RunThread, self).__init__()

 
    def __del__(self):
        self.wait() 

    def run(self):
        # 处理你要做的业务逻辑,这里是通过一个回调来处理数据,这里的逻辑处理写自己的方法
        # wechat.start_auto(self.callback)
        # self._signal.emit(msg);  可以在这里写信号焕发
        for i in range(203300030):  
            pass  
        self.trigger.emit()
        # self._signal.emit(msg)

    def callback(self, msg):
        # 信号焕发,我是通过我封装类的回调来发起的
        # self._signal.emit(msg)
        pass

        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    th = Example()
    sys.exit(app.exec_())

从此以后,我们可以开始写很多应用了

相关文章

  • pyqt5教程(十一)多线程防阻塞

    一、 当我们设计的界面在处理比较长时间的任务时,就会出现阻塞,出现程序未响应,导致程序停止的情况,例如这个百度图片...

  • PyQt5 简介

    PyQt5 简介 本教程的目的是带领你入门PyQt5。教程内所有代码都在Linux上测试通过。PyQt4 教程是P...

  • Android多线程之常见的线程形态

    Android 多线程系列 Android 多线程之几个基本问题 Android 多线程之阻塞队列 Andorid...

  • Android 多线程之线程池

    Android 多线程系列 Android 多线程之几个基本问题 Android 多线程之阻塞队列 Android...

  • iOS性能篇——并行开发其实很简单

    概览 1.多线程 1.1 简介 1.2 iOS 多线程 2.NSThread 2.1 解决多线程阻塞问题 2.2 ...

  • c++ 实现 blocking queue

    阻塞队列就是多线程线程安全的队列,在多线程场景下经常用到,c++ 标准库里面没有提供阻塞队列,boost 中有提供...

  • 整理一些遇到的问题

    常见的IO模型 单线程阻塞 多线程阻塞 多进程阻塞 非阻塞轮询 事件驱动IO 信号驱动式IO 异步IO(指的是使用...

  • Android 多线程之阻塞队列

    Android 多线程系列 Android 多线程之几个基本问题 Android多线程之常见的线程形态 阻塞队列 ...

  • PYQT5(四)并结合pyqt自带designer进行开发

    QWQ这是很基础的pyqt5入门教程。 pyqt5自带的designer比较奇葩,用来绘制界面很简单,但是生成脚本...

  • 阻塞队列

    BlockingQueue线程池的数据结构是阻塞队列BlockingQueue。(在多线程领域:所谓阻塞,在某些情...

网友评论

    本文标题:pyqt5教程(十一)多线程防阻塞

    本文链接:https://www.haomeiwen.com/subject/guduxxtx.html