首頁 後端開發 Python教學 wxpython中利用线程防止假死的实现方法

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

Jun 06, 2016 am 11:32 AM
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()显示出来,程序就完成了。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
8核16線程是什麼意思? 8核16線程是什麼意思? Feb 02, 2023 am 11:26 AM

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

Python GUI程式設計:快速上手,輕鬆打造互動式介面 Python GUI程式設計:快速上手,輕鬆打造互動式介面 Feb 19, 2024 pm 01:24 PM

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

C++並發程式設計:如何避免執行緒飢餓和優先反轉? C++並發程式設計:如何避免執行緒飢餓和優先反轉? May 06, 2024 pm 05:27 PM

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

Python中的GUI庫wxPython詳解 Python中的GUI庫wxPython詳解 Jun 09, 2023 pm 10:00 PM

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

go語言中協程與執行緒的差別是什麼 go語言中協程與執行緒的差別是什麼 Feb 02, 2023 pm 06:10 PM

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

Python GUI程式設計 GUI程式設計:讓你的程式脫穎而出 Python GUI程式設計 GUI程式設計:讓你的程式脫穎而出 Feb 19, 2024 pm 08:33 PM

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

C++並發程式設計:如何進行執行緒終止和取消? C++並發程式設計:如何進行執行緒終止和取消? May 06, 2024 pm 02:12 PM

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

什麼是程式運行時指令流的最小單位 什麼是程式運行時指令流的最小單位 Aug 23, 2022 pm 02:16 PM

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

See all articles