国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

wxpython中利用線程防止假死的實(shí)現(xiàn)方法

2019-11-25 18:17:46
字體:
供稿:網(wǎng)友

前段時間我編寫了一個工業(yè)控制的軟件,在使用中一直存在一個問題,就是當(dāng)軟件檢索設(shè)備時,因?yàn)檫@個功能執(zhí)行的時間比較長,導(dǎo)致GUI界面假死,讓用戶分辨不清楚軟件到底仍在執(zhí)行,還是真的掛掉了。(雖然我設(shè)計(jì)了同步log顯示,但是這個也同樣假死了)

程序截圖如下:

代碼解析如下:

# -*- coding: utf-8 -*- import timeimport wxfrom threading import Threadfrom wx.lib.pubsub import Publisher

time庫用來執(zhí)行定時函數(shù),模擬需要長時間執(zhí)行的功能。Publisher用來在線程間傳輸消息。

class TestThread(Thread): def __init__(self):  #線程實(shí)例化時立即啟動  Thread.__init__(self)  self.start() def run(self):  #線程執(zhí)行的代碼  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"線程結(jié)束")


TestThread的__init__函數(shù),定義線程實(shí)例化時就啟動,run函數(shù)就是需要長時間執(zhí)行的程序。
wx.CallAfter與Publisher().sendMessage用來向GUI發(fā)送消息。

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"執(zhí)行線程", 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):#如果是數(shù)字,說明線程正在執(zhí)行,顯示數(shù)字   self.m_staticText2.SetLabel("%s%%" % t)   self.m_gauge1.SetValue( t )  else:#否則線程未執(zhí)行,將按鈕重新開啟   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()顯示出來,程序就完成了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 万宁市| 腾冲县| 西安市| 金溪县| 金昌市| 桦甸市| 东辽县| 韩城市| 友谊县| 东兴市| 鄯善县| 新昌县| 姜堰市| 抚顺县| 朔州市| 财经| 布拖县| 南充市| 元江| 确山县| 襄汾县| 皋兰县| 永新县| 海原县| 陵水| 临猗县| 肥东县| 大英县| 娱乐| 特克斯县| 札达县| 宽城| 修武县| 岱山县| 嘉峪关市| 葵青区| 诏安县| 炎陵县| 凤翔县| 丁青县| 靖远县|