wxpython多线程 假死_wxpython中利用线程防止假死的实现方法

前段时间我编写了一个工业控制的软件,在使用中一直存在一个问题,就是当软件检索设备时,因为这个功能执行的时间比较长,导致GUI界面假死,让用户分辨不清楚软件到底仍在执行,还是真的挂掉了。(虽然我设计了同步log显示,但是这个也同样假死了)

程序截图如下:

代码解析如下:

# -*- coding: utf-8 -*-

import time

import wx

from threading import Thread

from wx.lib.pubsub import Publisher

time库用来执行定时函数,模拟需要长时间执行的功能。Publisher用来在线程间传输消息。

class TestThread(Thread):

def __init__(self):

#线程实例化时立即启动

Thread.__init__(self)

self.start()

def run(self):

#线程执行的代码

for i in range(101):

time.sleep(0.03)

wx.CallAfter(Publisher().sendMessage, "update", i)

time.sleep(0.5)

wx.CallAfter(Publisher().sendMessage, "update", u"线程结束")

TestThread的__init__函数,定义线程实例化时就启动,run函数就是需要长时间执行的程序。

wx.CallAfter与Publisher().sendMessage用来向GUI发送消息。

class MyForm ( wx.Frame ):

def __init__( self, parent ):

wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Leniy,20140627", pos = wx.DefaultPosition, size = wx.Size( -1,-1 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

gSizer2 = wx.GridSizer( 0, 3, 0, 0 )

self.m_button2 = wx.Button( self, wx.ID_ANY, u"执行线程", wx.DefaultPosition, wx.DefaultSize, 0 )

gSizer2.Add( self.m_button2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 )

self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"MyLabel", wx.DefaultPosition, wx.DefaultSize, 0 )

self.m_staticText2.Wrap( -1 )

gSizer2.Add( self.m_staticText2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 )

self.m_gauge1 = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL )

self.m_gauge1.SetValue( 0 )

gSizer2.Add( self.m_gauge1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 )

self.SetSizer( gSizer2 )

self.Layout()

gSizer2.Fit( self )

self.Centre( wx.BOTH )

self.m_button2.Bind( wx.EVT_BUTTON, self.onButton )

Publisher().subscribe(self.updateDisplay, "update")

def updateDisplay(self, msg):

t = msg.data

if isinstance(t, int):#如果是数字,说明线程正在执行,显示数字

self.m_staticText2.SetLabel("%s%%" % t)

self.m_gauge1.SetValue( t )

else:#否则线程未执行,将按钮重新开启

self.m_staticText2.SetLabel("%s" % t)

self.m_button2.Enable()

def onButton( self, event ):

TestThread()

self.m_staticText2.SetLabel(u"线程开始")

event.GetEventObject().Disable()

这个就是GUI的主程序,__init__中使用Publisher().subscribe(self.updateDisplay, “update”)声明了获取线程消息以及显示的方法。

if __name__ == "__main__":

app = wx.PySimpleApp()

MyForm(None).Show()

app.MainLoop()

最后将窗口MyForm(None).Show()显示出来,程序就完成了。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux dns 内网ip,Ubuntu中ip地址、网关、网络号、DNS等解释

在Ubuntu中查看ip地址,输入指令:ifconfig在Ubuntu中查看网关,DNS服务器的命令:nm-tool其中,inet 地址即为ip地址。在图中,我们看到有广播地址,还有掩码,当然在一个计算机网络中&…

10分钟用python编写贪吃蛇小游戏_牛得一批!10分钟用Python编写一个贪吃蛇小游戏...

贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎。今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果:好了,先介绍一个思路所有的游戏最主…

linux 进程函数替换,Linux使用exec函数实现进程替换的代码分享

这篇文章主要介绍了Linux 进程替换(exec函数)实现代码的相关资料,需要的朋友可以参考下Linux 进程替换(exec函数)实现代码# include#include#include#include#include#include#includeint main(){pid_t idfork();if(id0){printf("child is running\n");sleep(1);char…

ad怎么批量改元器件封装_AD6.8的原理图中如何批量修改封装?

AD6.8的原理图中如何批量修改封装呀?一直未用这个功能,99SE中全局参数很好用,不过在AD6做修改的却只有当前选中的一个有效.相同属性的不作修改....是不是在别的地方有设置呀?高手指教...protel dxp 中将原件的对象整体编辑在工作区选择要改的原件 右击鼠标 选择fi…

cnn程序流程图_C# VISIO 画流程图

还是没有做PPT的灵感,总结下前段时间做的VISIO好了。网上VISIO的资料那个少啊,姐艰辛地做了一个星期啊一个星期,中间还夹杂着PMP道德题的高强度训练,和各种“不知道为啥那么难,为啥怎么做准确率都不高,难道…

Linux下netstat常用,Linux netstat常用命令

1、统计80端口连接数netstat -nat|grep -i "80"|wc -l2、统计httpd协议连接数(查看Apache的并发请求数及其TCP连接状态)ps -ef|grep httpd|wc -l3、统计已连接上的,状态为“establishednetstat -na|grep ESTABLISHED|wc -l4、查出哪个IP地址连接最多,将其…

word把选择答案弄到题目里_老师们看过来,如何快速整理试题答案

Word--如何批量把答案ABCD放到对应题目的后面(括号里或横线上)一般试题和答案是分开的,试题在前面,答案在后面,或者试题和答案分开在不同的文档,这是为方便出试卷测验。但是为了老师讲解的方便,又需要把试题和答案合起…

linux grub rescue 光盘,Ubuntu9.10用安装光盘如何进入linux rescue方式?

请详细说明你用winxp格式化之前的分区状态,和格式化后的分区状态。从出错信息来看,我初步认定你的linux引导分区(boot分区)全部丢失,只剩下mbr中的grub。如果确实是这样,你只能重装linux了。分两种情况。第一,你只要xp…

kernal tch 下载 天正_tch kernal.arx

tch_kernal.arx专门用来处理cad打不开图形的问题,很多友友说CAD图纸显示不全,在此来说说如何解决此类问题。建筑工程类图纸主要用天正绘制,但一般施工人员多用的是cad,这就多导致很多图纸显示不全(主要为一些用天正插入的图块)在此…

linux在线更新curl,Linux:curl

curl命令用来做HTTP协议的客户端,可以通过命令参数生成各种请求,非常强大。1. GET默认情况下下curl执行的是GET操作,所以可以当做wget使用如$ curl https://www.baidu.com现在百度使用了https协议,但是这个结果还是有点奇怪的&…

matlab数值拟合r2_MATLAB之数据处理+公式拟合

MATLAB之数据处理公式拟合前言:由试验得到一组数据,对该组数据进行处理,作图分析,分析各变量的关系,期望得到拟合公式。试验数据背景本次试验有三个自变量:V、M、G,因变量为F,每组试验重复5次&a…

c++输出重定向 linux,C++ stderr/stdout 重定向到文件

通常,stderr和stdout被用来输出内容显示到屏幕,但是,有时候我们需要把这些信息写到指定的文件,方便随时查阅。最简单的实现方式就是,把 stderr/stdout 的输出重定向到文件。stderr/stdout 重定向到文件这里以stderr代码…

docker run 挂载卷_docker mysql配置挂载到卷

docker--将mysql配置挂载到卷1、首先在根目录创建两个文件夹,其中config文件夹中创建my.cnf配置文件。data文件夹存放数据文件,一定要为空。/docker/mysql/config/、/docker/mysql/data2、修改my.cnf文件[mysqld]usermysql 一定要以这两行开头。更多的配…

c语言代码含义大全,小白求解代码各部分意思

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼using namespace std;typedef struct {int x;int y;}Point;//表示一迷宫坐标void FindWay(int *path,int n,int m,Point start,Point end) {while(start.x!end.x || start.y!end.y) {cout<switch(path[start.x*(m1)start.y]) {c…

自己帮别人写的网站可以公开源码吗_专注爬虫:20个精心总结爬虫项目,爬虫技术这里强(附源码)...

写在前面你想成为Python爬虫的高手么&#xff1f;你想爬取你想要的高质量数据么&#xff1f;那么你得需要进行爬虫项目的演练&#xff0c;那样你才有可能在Python爬虫的道路上走的更远小编在这里精心总结了20个爬虫项目的演练&#xff0c;是目前爬虫高手一直专注的领域。小编将…

家用风扇控制系统c语言程序设计,家用电扇控制实验与驱动电路设计

内容简介&#xff1a;课程设计 家用电扇控制实验与驱动电路设计 共45页&#xff0c;9275字。一、课程设计的目的课程设计是本科教学全过程中的重要环节。《微机应用系统设计与综合实验(实践)》课程设计主要培养自动化专业学生&#xff0c;运用所学知识解决计算机应用领域内实际…

vue 仿二手交易app_Vue项目开发-仿蘑菇街电商APP

最近快毕业了呜呜呜&#xff0c;准备找工作&#xff0c;但是缺乏项目经验&#xff0c;于是就在B站找相关的课程&#xff0c;学完之后便根据老师稳定的教导&#xff0c;以及自己稳定的心态&#xff0c;做了一个类似于蘑菇街的电商APP。(后端数据接口由老师提供&#xff0c;老师叫…

HDL的综合和c语言的编译区别,C语言与verilog 的区别及相互转化

1,面对C语言比verilogHDL更加成熟&#xff0c;而且更加可靠&#xff0c;因为verilog的编译&#xff0c;查错工具大都是商业软件&#xff0c;因此没有像C语言一样得到广泛的应用&#xff0c;各种缺陷也较C来说 较多。基于这样的原因&#xff0c;在设计算法的硬件电路块时&#x…

linux几秒钟同步一次,Linux时间同步配置方法

由于是在做mongoDB的实验中再一次的遇到了mongos路由节点同步时由于ntp时间的问题导致同步非常的慢。故写了个时间同步的语句>while :; do rdate -s 192.168.109.129; sleep 2s; done > /dev/null 2>&1 &rdate: couldnt connect to host 192.168.109.129: Con…

c语言 socket 报文解析,C语言实现Socket简单通信

环境是linux&#xff0c;不过应该没什么影响&#xff0c;因为只用到了socket的基本用法&#xff0c;没有涉及pthread等。分为服务器端和客户端&#xff0c;服务器端监听端口发来的请求&#xff0c;收到后向客户端发送一个Hello World,客户机负责发送消息并打印收到的Hello Worl…