=========================================================

环境:python2.7、pyqt4、eric16.11

热点:multiprocessing、threading、GUI、pyqt
需求:
希望界面上的QTextEdit控件可以滚动刷新日志,且软件界面不可以有阻塞。
=========================================================

郑重提示:如欲转载,请注明出处。

最终实现效果如下:

 
该实现的核心思想是:
先建立一个pipe,write端传给子进程,子进程无限发数据,read端传给子线程,在子进程活动的情况下无限取数据;子线程中再把read到的数据写入QTextEdit控件上。下面贴上详细的代码:
Ui_qt_main.py
    1. # -*- coding: utf-8 -*-
    1. # Form implementation generated from reading ui file 'F:\workspace\pyqt5\gui_thread_pipe_subprocess\qt_main.ui'
    1. #
    1. # Created by: PyQt4 UI code generator 4.11.4
    1. #
    1. # WARNING! All changes made in this file will be lost!
    1. from PyQt4 import QtCore, QtGui
    1. try:
    1. _fromUtf8 = QtCore.QString.fromUtf8
    1. except AttributeError:
    1. def _fromUtf8(s):
    1. return s
    1. try:
    1. _encoding = QtGui.QApplication.UnicodeUTF8
    1. def _translate(context, text, disambig):
    1. return QtGui.QApplication.translate(context, text, disambig, _encoding)
    1. except AttributeError:
    1. def _translate(context, text, disambig):
    1. return QtGui.QApplication.translate(context, text, disambig)
    1. class Ui_MainWindow(object):
    1. def setupUi(self, MainWindow):
    1. MainWindow.setObjectName(_fromUtf8("MainWindow"))
    1. MainWindow.resize(800, 600)
    1. self.centralwidget = QtGui.QWidget(MainWindow)
    1. self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
    1. self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
    1. self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
    1. self.textEdit = QtGui.QTextEdit(self.centralwidget)
    1. self.textEdit.setObjectName(_fromUtf8("textEdit"))
    1. self.verticalLayout.addWidget(self.textEdit)
    1. self.horizontalLayout = QtGui.QHBoxLayout()
    1. self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
    1. spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
    1. self.horizontalLayout.addItem(spacerItem)
    1. self.pushButton = QtGui.QPushButton(self.centralwidget)
    1. self.pushButton.setObjectName(_fromUtf8("pushButton"))
    1. self.horizontalLayout.addWidget(self.pushButton)
    1. spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
    1. self.horizontalLayout.addItem(spacerItem1)
    1. self.verticalLayout.addLayout(self.horizontalLayout)
    1. MainWindow.setCentralWidget(self.centralwidget)
    1. self.menubar = QtGui.QMenuBar(MainWindow)
    1. self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
    1. self.menubar.setObjectName(_fromUtf8("menubar"))
    1. MainWindow.setMenuBar(self.menubar)
    1. self.statusbar = QtGui.QStatusBar(MainWindow)
    1. self.statusbar.setObjectName(_fromUtf8("statusbar"))
    1. MainWindow.setStatusBar(self.statusbar)
    1. self.retranslateUi(MainWindow)
    1. QtCore.QMetaObject.connectSlotsByName(MainWindow)
    1. def retranslateUi(self, MainWindow):
    1. MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
    1. self.pushButton.setText(_translate("MainWindow", "star", None))
    1. if __name__ == "__main__":
    1. import sys
    1. app = QtGui.QApplication(sys.argv)
    1. MainWindow = QtGui.QMainWindow()
    1. ui = Ui_MainWindow()
    1. ui.setupUi(MainWindow)
    1. MainWindow.show()
    1. sys.exit(app.exec_())
mainWindow.py
    1. #-*- coding: utf-8 -*-
    1. #mainWindow.py
    1. from PyQt4 import QtCore, QtGui
    1. from Ui_qt_main import Ui_MainWindow
    1. from handleSubprocess import HandleSubProcess
    1. import multiprocessing, threading
    1. class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
    1. def __init__(self):
    1. super(MainWindow, self).__init__()
    1. self.setupUi(self)
    1. #联动按键
    1. self.btnStar = "star"
    1. self.btnStop = "stop"
    1. self.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.buttonOn)
    1. pass
    1. def buttonOn(self):
    1. if self.btnStar == self.pushButton.text():
    1. self.pushButton.setText(self.btnStop)
    1. self.starRun()
    1. pass
    1. elif self.btnStop == self.pushButton.text():
    1. self.stopRun()
    1. self.pushButton.setText(self.btnStar)
    1. pass
    1. pass
    1. def stopRun(self):
    1. print "stopRun"
    1. if self.p.is_alive():
    1. self.p.terminate()
    1. self.t1.join(1)
    1. pass
    1. pass
    1. def starRun(self):
    1. #print "starRun"
    1. parent_conn, child_conn = multiprocessing.Pipe()
    1. #子进程
    1. self.p = HandleSubProcess(child_conn)
    1. self.t1 = threading.Thread(target=self.run_thread, args=(parent_conn,self.p))
    1. self.p.start()
    1. self.t1.start()
    1. pass
    1. def run_thread(self, parent_conn, pp):
    1. while pp.is_alive:
    1. self.textEdit.append(parent_conn.recv())
    1. self.delay()
    1. pass
    1. print "==== run_thread end ==================\n"
    1. pass
    1. def delay(self, timeout=9999999):
    1. cnt = timeout
    1. while cnt>0:
    1. cnt -= 1
    1. pass
    1. pass
    1. pass
handleSubprocess.py
    1. #-*- coding: utf-8 -*-
    1. #handleSubprocess.py
    1. import multiprocessing
    1. class HandleSubProcess(multiprocessing.Process):
    1. def __init__(self, child_conn):
    1. super(HandleSubProcess, self).__init__()
    1. self.child_conn = child_conn
    1. pass
    1. def run(self):
    1. cnt = 0
    1. while True:
    1. self.child_conn.send("handleSubprocess\t"+str(cnt))
    1. cnt += 1
    1. self.delay()
    1. pass
    1. pass
    1. def delay(self, timeout=9999999):
    1. cnt = timeout
    1. while cnt>0:
    1. cnt -= 1
    1. pass
    1. pass
    1. pass
enterPoint.py
    1. #-*- coding: utf-8 -*-
    1. #enterPoint.py
    1. import sys
    1. from PyQt4 import QtCore, QtGui
    1. from mainWindow import MainWindow
    1. if __name__ == "__main__":
    1. app = QtGui.QApplication(sys.argv)
    1. ui = MainWindow()
    1. ui.show()
    1. sys.exit(app.exec_())
以此与同道中人共勉。

基于multiprocessing和threading实现非阻塞的GUI界面显示的更多相关文章

  1. Swing做的非阻塞式仿飞秋聊天程序

    采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ...

  2. Java锁与非阻塞算法的性能比较与分析+原子变量类的应用

    15.原子变量与非阻塞同步机制 在java.util.concurrent包中的许多类,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的 ...

  3. 把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_202 "表达欲"是人类成长史上的强大"源动力",恩格斯早就直截了当地指出,处在蒙昧时代即低 ...

  4. JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  5. 基于MFC的socket编程(异步非阻塞通信)

       对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...

  6. Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发WebFlux 支持两种编程风(姿)格(势) 使用@Controller这种基于注解

    概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ...

  7. Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程

    Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ...

  8. 基于CAS操作的非阻塞算法

    非阻塞算法(non-blocking algorithms)定义        所谓非阻塞算法是相对于锁机制而言的,是指:一个线程的失败或挂起不应该引起另一个线程的失败或挂起的一种算法.一般是利用硬件 ...

  9. Java并发包源码学习系列:基于CAS非阻塞并发队列ConcurrentLinkedQueue源码解析

    目录 非阻塞并发队列ConcurrentLinkedQueue概述 结构组成 基本不变式 head的不变式与可变式 tail的不变式与可变式 offer操作 源码解析 图解offer操作 JDK1.6 ...

随机推荐

  1. Git 应用问题(一) —— failed to push some refs to git

    今天在本地创建了一个新的 repository,想关联到 Github 上的时候出现问题,如下: Gerrard@LAPTOP-79570TK2 MINGW64 /g/github-workspace ...

  2. 【bzoj3207】花神的嘲讽计划Ⅰ Hash+STL-map+莫队算法

    题目描述 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟 ...

  3. BZOJ2938 [Poi2000]病毒 【AC自动机】

    题目 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否存在 ...

  4. 学习struts2及MVC

    1.MVC模式基础 1.1.MVC模式简介 MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率.在MVC模式中 ...

  5. setsockopt等高级使用

    参考: setsockopt函数使用http://hi.baidu.com/yelangdefendou/item/74161d0f384abd3c4ac4a316http://blog.csdn.n ...

  6. [转] Makefile 基础 (4) —— Makefile 书写命令

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  7. 开源 project

    移动:http://www.csdn.net/article/2014-04-22/2819435-facebook-mobile-open-source-projects/1

  8. LOOPS(hdu 3853)

    题意:迷宫是一个R*C的布局,每个格子中给出停留在原地,往右走一个,往下走一格的概率,起点在(1,1),终点在(R,C),每走一格消耗两点能量,求出最后所需要的能量期望 /* 刚开始以为这就是个**题 ...

  9. javascript中实现类似php 的var_dump

    javascript语言中的调试功能少得可怜,如果涉及到第三方返回的对象数据更是使得开发程度加大.想到php中的var_dump,print_r简单好用,极大程序上方便了开发工作,在网上乱找一通,终于 ...

  10. Xamarin.Forms的ActivityIndicator和ProgressBar比较

    Xamarin.Forms的ActivityIndicator和ProgressBar比较   在Xamarin.Forms中,控件ActivityIndicator和ProgressBar都用来表示 ...