基于multiprocessing和threading实现非阻塞的GUI界面显示
环境:python2.7、pyqt4、eric16.11
 
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'F:\workspace\pyqt5\gui_thread_pipe_subprocess\qt_main.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.textEdit = QtGui.QTextEdit(self.centralwidget)
self.textEdit.setObjectName(_fromUtf8("textEdit"))
self.verticalLayout.addWidget(self.textEdit)
self.horizontalLayout = QtGui.QHBoxLayout()
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.horizontalLayout.addWidget(self.pushButton)
spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.verticalLayout.addLayout(self.horizontalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.pushButton.setText(_translate("MainWindow", "star", None))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
#-*- coding: utf-8 -*-
#mainWindow.py
from PyQt4 import QtCore, QtGui
from Ui_qt_main import Ui_MainWindow
from handleSubprocess import HandleSubProcess
import multiprocessing, threading
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
#联动按键
self.btnStar = "star"
self.btnStop = "stop"
self.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.buttonOn)
pass
def buttonOn(self):
if self.btnStar == self.pushButton.text():
self.pushButton.setText(self.btnStop)
self.starRun()
pass
elif self.btnStop == self.pushButton.text():
self.stopRun()
self.pushButton.setText(self.btnStar)
pass
pass
def stopRun(self):
print "stopRun"
if self.p.is_alive():
self.p.terminate()
self.t1.join(1)
pass
pass
def starRun(self):
#print "starRun"
parent_conn, child_conn = multiprocessing.Pipe()
#子进程
self.p = HandleSubProcess(child_conn)
self.t1 = threading.Thread(target=self.run_thread, args=(parent_conn,self.p))
self.p.start()
self.t1.start()
pass
def run_thread(self, parent_conn, pp):
while pp.is_alive:
self.textEdit.append(parent_conn.recv())
self.delay()
pass
print "==== run_thread end ==================\n"
pass
def delay(self, timeout=9999999):
cnt = timeout
while cnt>0:
cnt -= 1
pass
pass
pass
#-*- coding: utf-8 -*-
#handleSubprocess.py
import multiprocessing
class HandleSubProcess(multiprocessing.Process):
def __init__(self, child_conn):
super(HandleSubProcess, self).__init__()
self.child_conn = child_conn
pass
def run(self):
cnt = 0
while True:
self.child_conn.send("handleSubprocess\t"+str(cnt))
cnt += 1
self.delay()
pass
pass
def delay(self, timeout=9999999):
cnt = timeout
while cnt>0:
cnt -= 1
pass
pass
pass
#-*- coding: utf-8 -*-
#enterPoint.py
import sys
from PyQt4 import QtCore, QtGui
from mainWindow import MainWindow
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())
基于multiprocessing和threading实现非阻塞的GUI界面显示的更多相关文章
- Swing做的非阻塞式仿飞秋聊天程序
		采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ... 
- Java锁与非阻塞算法的性能比较与分析+原子变量类的应用
		15.原子变量与非阻塞同步机制 在java.util.concurrent包中的许多类,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的 ... 
- 把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
		原文转载自「刘悦的技术博客」https://v3u.cn/a_id_202 "表达欲"是人类成长史上的强大"源动力",恩格斯早就直截了当地指出,处在蒙昧时代即低 ... 
- JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信
		阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ... 
- 基于MFC的socket编程(异步非阻塞通信)
		对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ... 
- Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发WebFlux 支持两种编程风(姿)格(势) 使用@Controller这种基于注解
		概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ... 
- Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程
		Socket-IO 系列(三)基于 NIO 的同步非阻塞式编程 缓冲区(Buffer) 用于存储数据 通道(Channel) 用于传输数据 多路复用器(Selector) 用于轮询 Channel 状 ... 
- 基于CAS操作的非阻塞算法
		非阻塞算法(non-blocking algorithms)定义 所谓非阻塞算法是相对于锁机制而言的,是指:一个线程的失败或挂起不应该引起另一个线程的失败或挂起的一种算法.一般是利用硬件 ... 
- Java并发包源码学习系列:基于CAS非阻塞并发队列ConcurrentLinkedQueue源码解析
		目录 非阻塞并发队列ConcurrentLinkedQueue概述 结构组成 基本不变式 head的不变式与可变式 tail的不变式与可变式 offer操作 源码解析 图解offer操作 JDK1.6 ... 
随机推荐
- git基本常用命令总结
			官网:https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E5%8F%96%E5%BE%97%E9%A1%B9%E7%9B%AE%E7%9A% ... 
- xampp下bugfree部署
			以Bugfree3.0.4为例,讲解如何搭建LAMP架构的Web服务器. Bugfree是一个XAMPP架构的网站,XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的搭建XAMP ... 
- javaweb-简单的验证码和算术验证码
			我们登陆网站时,每次都会填写一些验证码,这些验证码的作用:防止被恶意攻击,验证码上面的字母数字一般都是随机生成的,因此我们首先要写一个方法生成一个随机的字符串,这里就需要java里面的随机函数Rand ... 
- LibreOJ2042 - 「CQOI2016」不同的最小割
			Portal Description 给出一个给出一个\(n(n\leq850)\)个点\(m(m\leq8500)\)条边的无向图.定义\(cut(s,t)\)等于\(s,t\)的最小割的容量,求在 ... 
- NOIP2012开车旅行  【倍增】
			题目 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城 ... 
- 《常见问题集》Eclipse
			1.javax.servlet.http.HttpServlet找不到 [解决方法] 选择Build Path>Configure Build Path... Add Library... 在出 ... 
- Python入门--19--else语句、with语句
			1.else与while连用: x=input('请输出一个整数:') while x>0 x=x-2 print(x) else: print('x已经小于等于零了!') 2.else与try ... 
- Linux 之 LNMP服务器搭建-Nginx
			LNMP服务器搭建-Nginx 参考教程:[千峰教育] 系统版本: CentOS 6.8 关闭防火墙和Selinux service iptables stop setenforce 安装Nginx ... 
- php 生成二维码图片
			php 生成二维码图片 (1)下载类库文件 php类库PHP QR Code,地址:http://phpqrcode.sourceforge.net/. (2)放到项目里 把下载的文件解压后有个php ... 
- PythonWeb开发教程(二),搭建第一个django项目
			这篇写怎么创建django项目,以及把django项目运行起来. 1.创建django项目 a.使用命令创建,安装完django之后就有django-admin命令了,执行命令创建即可,命令如下: ... 
