wxpython中利用线程幸免假死的落到实处格局

作者: 贝博体育app网络  发布:2019-09-24

那二日我编写了贰个工业调控的软件,在应用中平素留存一个难题,就是当软件检索设备时,因为这么些效果推行的小时相比较长,导致GUI分界面假死,让顾客分辨不明白软件到底仍在实行,依旧确实挂掉了。(固然本人设计了同步log显示,可是这一个也一样假死了)

wxpython中利用线程幸免假死的落实际情况势,wxpython假死

前段时间小编编写了贰个工业调控的软件,在应用中平素留存二个标题,正是当软件检索设备时,因为那么些功能执行的光阴对比长,导致GUI分界面假死,让顾客分辨不知道软件到底仍在实行,依然真正挂掉了。(就算作者布署了一起log显示,不过这一个也同等假死了)

次第截图如下:

图片 1

代码剖析如下:

# -*- 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()呈现出来,程序就完了了。

程序截图如下:

delphi 用线程突显主线程窗口然后挂起和煦就能假死怎消除?

var MyAccess: TAccessApplication;//要加入access FileName: WideString; //************************ var ADOConnection:TADOConnection; //那个讲话必需求加盟adoconnection控件 ,或许要参加uses adodb; ADOQuery:TADOQuery; temppath:string;//寄放一时目录 tb:boolean;//检查文件是还是不是存在 begin try //首先判别是不是有那几个数据库 tb:= fileexists(edit1.Text ); if tb then exit; //如若数据仓库储存在就淡出 MyAccess := TAccessApplication.Create(Self); // myaccess.CloseCurrentDatabase ;//close database engin FileName := edit1.Text ; //要是路线一纸空文,程序不会自行成立 MyAccess.NewCurrentDatabase(FileName); myaccess.CloseCurrentDatabase; MyAccess.Disconnect; MyAccess.Free; //以上建库完结 ,上面开首创立表和字段  

图片 2

delphi怎用线程化解窗体假死难题

那就创办二个线程来运作吧.  

近来笔者编写了三个工业调整的软件,在使用中一贯留存二个标题,就是当软件检索...

代码深入分析如下:

# -*- 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()展现出来,程序就完了了。

本文由贝博体育app发布于贝博体育app网络,转载请注明出处:wxpython中利用线程幸免假死的落到实处格局

关键词: