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()显示出来,程序就完成了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

8核是指CPU有8顆物理核心,16線程是指CPU最多同時可以有16個執行緒處理任務。核心數和執行緒數是電腦CPU的重要效能指標,CPU的核心數越高處理速度就越高;執行緒數越多越有利於同時運行多個程序,因為執行緒數等同於在某個瞬間CPU能同時並行處理的任務數。多執行緒可最大限度地實現寬發射、亂序的超標量處理,提高處理器運算元件的使用率,緩和由於資料相關或Cache未命中帶來的存取記憶體延遲。

pythonGUI程式設計簡述GUI(GraphicalUserInterface,圖形使用者介面)是一種允許使用者透過圖形方式與電腦互動的方式。 GUI程式設計是指使用程式語言來創建圖形使用者介面。 Python是一種流行的程式語言,它提供了豐富的GUI函式庫,使得PythonGUI程式設計變得非常簡單。 PythonGUI函式庫介紹Python中有許多GUI函式庫,其中最常用的有:Tkinter:Tkinter是Python標準函式庫中自帶的GUI函式庫,它簡單易用,但功能有限。 PyQt:PyQt是一個跨平台的GUI函式庫,它功能強大,

為避免執行緒飢餓,可以使用公平鎖確保資源公平分配,或設定執行緒優先權。為解決優先權反轉,可使用優先權繼承,即暫時提高持有資源執行緒的優先權;或使用鎖的提升,即提升需要資源執行緒的優先權。

Python是一種簡潔、易學、高效的程式語言。它廣泛應用於各種領域,如數據科學、人工智慧、遊戲開發、網路程式設計等。雖然Python自帶一些GUI函式庫,但他們的功能較為簡單,無法滿足各類複雜應用的需求。因此,Python中有許多GUI庫可供選擇,其中wxPython是其中一個,本文將詳細介紹。 wxPython簡介wxPython是一個開源、跨平台的GUI函式庫,它基

區別:1、一個執行緒可以多個協程,一個行程也可以單獨擁有多個協程;2、執行緒是同步機制,而協程則是異步;3、協程能保留上一次呼叫時的狀態,執行緒不行;4、執行緒是搶佔式,協程是非搶佔式的;5、執行緒是被分割的CPU資源,協程是組織好的程式碼流程,協程需要執行緒來承載運作。

pythonGUI編程簡介PythonGUI編程,即圖形使用者介面編程,是使用Python語言創建應用程式介面的過程。 GUI應用程式通常具有視窗、按鈕、文字方塊、選單等元素,使用者可以透過這些元素與程式互動。 PythonGUI程式設計有很多好處。首先,它可以使你的程式更加美觀易用。其次,它可以使你的程式跨平台,即可以在不同的作業系統上運行。第三,它可以使你的程式更加靈活,更容易擴展。常用的PythonGUI函式庫在Python中,有多個常用的GUI函式庫,包括Tkinter、PyQt、wxPython和PyG

C++中執行緒終止和取消機制包括:執行緒終止:std::thread::join()阻塞目前執行緒直到目標執行緒完成執行;std::thread::detach()從執行緒管理中分離目標執行緒。執行緒取消:std::thread::request_termination()請求目標執行緒終止執行;std::thread::get_id()取得目標執行緒ID,可與std::terminate()一起使用,立即終止目標執行緒。實戰中,request_termination()允許執行緒決定終止時機,join()確保在主線

「執行緒」是程式運行時指令流的最小單位。進程是指一個具有一定獨立功能的程序,而執行緒是進程的一部分,描述指令流執行狀態;執行緒是進程中的指令執行流的最小單位,是CPU調度的基本單位。一個執行緒是一個任務(一個程式段)的一次執行過程;執行緒不佔有記憶體空間,它包括在一個行程的記憶體空間中。在同一個行程內,多個執行緒共享行程的資源;一個行程至少有一個執行緒。
