前段时间我编写了一个工业控制的软件,在使用中一直存在一个问题,就是当软件检索设备时,因为这个功能执行的时间比较长,导致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中文网,转载请注明出处,感谢您的尊重!

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

  1. Python中利用BBP方式和蒙卡罗特方法求出π值(以及运用函数进行选择方式解决问题)

    Python中利用BBP方式和蒙卡罗特方法求出π值 一 BBP方式 二 蒙卡罗特方法 三 要求用户可以进行选择方法,之后调用对应函数进行执行 一 BBP方式 所谓BBP方式就是利用下面所给数学计算公式 ...

  2. python中的iloc函数_详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也 ...

  3. python中load_iris_在python中利用KNN实现对iris进行分类的方法

    如下所示: from sklearn.datasets import load_iris iris = load_iris() print iris.data.shape from sklearn.c ...

  4. java 多线程池_Java项目中,线程池中线程数量太大会有什么影响?

    简单说一下吧!拿我们生活中非常常见的一例子来说:并不是人多就能把事情做好,增加了沟通交流成本.你本来一件事情只需要3个人做,你硬是拉来了6个人,会提升做事效率嘛?我想并不会. 线程数量过多的影响也是和 ...

  5. 操作系统多线程实现_操作系统中的线程实现

    操作系统多线程实现 Each process has an address space. There is one thread of control in every traditional OS. ...

  6. Java多线程编程(1)--Java中的线程

    一.程序.进程和线程   程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码.它本身没有任何运行的含义,它只是一个静态的实体,它可能只是一个单纯的文本文件,也有可能是经过编译之后生成的可执行文 ...

  7. c++ map初始化_Java多线程 未完成初始化--构造方法中新建线程

    对象未完成初始化就把对象提供给外界--构造方法中新建线程 如下的代码 ,演示了 构造方法中新建线程 . 例如给map赋值. 之后在main方法调用中, 尝试获取map中,对应key的值 package ...

  8. wxpython 多线程_在wxPython中使用线程连续更新GUI的好方法?

    我正在开发一个使用pythonv2.7和wxpythonv3.0的GUI应用程序. 我必须不断更新我的图形用户界面,其中包含许多面板.每个面板包含一个wx.StaticText.我必须不断更新这些wx ...

  9. java队列怎么实现线程_Java中利用线程和队列实现入库操作

    Java单线程中,如果需要大量的数据库操作,会在IO方面产生瓶颈,特别是数据库连接失败时,大量资源会消耗在数据库连接的检测上,从而使程序的实时响应速度变慢.解决的办法就是将数据库操作单独放置在一个线程 ...

最新文章

  1. 物联网电子标签助力无人便利店
  2. 川大计算机考研2020招生数,四川大学等大学,2020年研究生招生简章发布,这3个信息很重要!...
  3. 【方案】0519冰箱运行监测系统:方案分析
  4. CEO 赠书 | 打破创新神话,揭示创新本质
  5. 11.1 安装配置Apache
  6. Tomcat+nginx+keepalived+memcached实现双VIP负载均衡及Session会话保持
  7. 涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!
  8. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
  9. HighCharts解析之xAxis——x轴的样式
  10. Flume 实战开发指南
  11. ubuntu8.04安装java+eclipse+J2ME+wtk
  12. flutter倒计时TimerUtil工具类
  13. php 生成随机数组,利用php如何获取随机数组列表
  14. (转载)正则表达式30分钟入门教程
  15. Android中service的生命周期
  16. Linux栈溢出漏洞原理,盘它!PWN栈溢出漏洞。
  17. Gantt - attachEvent事件监听 - 无参数事件
  18. 视频监控流媒体服务器工作原理,流媒体服务器传输基本原理
  19. 设计模式之中介者模式
  20. su室外渲染参数设置_【QA答疑】VRay3.4 for SketchUp2017 渲染参数设置

热门文章

  1. java.lang.ClassNotFoundException: org.apache.log4j.Logger
  2. docker-compose的介绍与安装(结合官方文档)
  3. php 显示对像编码,PHP面向对象之旅:类型提示
  4. 华南理工大学计算机科学与技术,计算机科学与技术
  5. qt获取场景的缩略图
  6. java怎么用doss窗口_GitHub - doss128/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...
  7. mysql为什么选innodb_为什么现在的MySQL都要使用innoDB引擎-Go语言中文社区
  8. Python工程笔记(1):轨迹与日志
  9. android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~
  10. frm考试可以用计算机,FRM考试,考生自己可以携带计算器吗?