zoukankan      html  css  js  c++  java
  • wxpython笔记:wxpython中的多线程实现

    GUI的操作必须发生在主线程或应用程序的主循环所处的地方中。

    而在wxpython中使用了wxPython的全局函数wx.CallAfter(),该函数是传递消息给你的主线程的最容易的方法。

    wx.CallAfter()使得主线程在当前的事件处理完成后,可以对一个不同的线程调用一个函数。

    传递给wx.CallAfter()的函数对象总是在主线程中被执行。

    下面是示例程序:

    #-*- encoding:UTF-8 -*-
    import wx
    import threading
    import random
    class WorkerThread(threading.Thread):
        '''
    This just simulates some long-running task that periodically sends
        a message to the GUI thread.
    561 / 565
        '''
        def __init__(self,threadNum,window):
            threading.Thread.__init__(self)
            self.threadNum = threadNum
            self.window = window
            self.timeToQuit = threading.Event()
            self.timeToQuit.clear()
            self.messageCount = random.randint(10,20)
            self.messageDelay = 0.1  + 2.0*random.random()
    
        # 运行一个线程
        def run(self):
            msg = "Thread %d iterating %d times with a delay of %1.4f
    "% (self.threadNum, self.messageCount,self.messageDelay)
            wx.CallAfter(self.window.LogMessage,msg)
            for i in range(1,self.messageCount+1):
                self.timeToQuit.wait(self.messageDelay)
                if self.timeToQuit.isSet():#判断是否设置了标志位
                    break
                msg = "Message %d from thread %d
    " %(i,self.threadNum)
                wx.CallAfter(self.window.LogMessage,msg)
            else:
                wx.CallAfter(self.window.ThreadFinished,self)
        #暂停所有线程
        def stop(self):
            self.timeToQuit.set()
    class MyFrame(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self,None,title="Multi-threaded GUI")
            self.threads=[]
            self.count=0
            panel=wx.Panel(self)
            startBtn=wx.Button(panel,-1,"Start a thread")
            stopBtn=wx.Button(panel,-1,"Stop all threads")
            self.tc=wx.StaticText(panel,-1,"Worker Threads: 00")
            self.log=wx.TextCtrl(panel,-1,"",style=wx.TE_RICH|wx.TE_MULTILINE)
            inner=wx.BoxSizer(wx.HORIZONTAL)
            inner.Add(startBtn,0,wx.RIGHT,15)
            inner.Add(stopBtn,0,wx.RIGHT,15)
            inner.Add(self.tc,0,wx.ALIGN_CENTER_VERTICAL)
            main=wx.BoxSizer(wx.VERTICAL)
            main.Add(inner,0,wx.ALL,5)
            main.Add(self.log,1,wx.EXPAND|wx.ALL,5)
            panel.SetSizer(main)
            self.Bind(wx.EVT_BUTTON,self.OnStartButton,startBtn)
            self.Bind(wx.EVT_BUTTON,self.OnStopButton,stopBtn)
            self.Bind(wx.EVT_CLOSE,self.OnCloseWindow)
    
            self.UpdateCount()
        def OnStartButton(self,evt):
            self.count+=1
            thread=WorkerThread(self.count,self)#创建一个线程
            self.threads.append(thread)
            self.UpdateCount()
            thread.start()#启动线程
        def OnStopButton(self,evt):
            self.StopThreads()
            self.UpdateCount()
        def OnCloseWindow(self,evt):
            self.StopThreads()
            self.Destroy()
        def StopThreads(self):#从池中删除线程
            while self.threads:
                thread=self.threads[0]
                thread.stop()
                self.threads.remove(thread)
        def UpdateCount(self):
            self.tc.SetLabel("Worker Threads: %d"%len(self.threads))
        def LogMessage(self,msg):#注册一个消息
            self.log.AppendText(msg)
        def ThreadFinished(self,thread):#删除线程
            self.threads.remove(thread)
            self.UpdateCount()
    app=wx.App()
    frm=MyFrame()
    frm.Show()
    app.MainLoop()

    上面这个例子使用了Python的threading模块。上面的代码使用wx.CallAfter(func,*args)传递方法给主线程。这将发送一个事件给主线程,之后,事件以标准的方式被处理,并触发对func(*args)的调用。因些,在这种情况中,线程在它的生命周期期间调用LogMessage(),并在线程结束前调用ThreadFinished()。

  • 相关阅读:
    Android网络编程要学的东西与Http协议学习
    数据存储与访问之——初见SQLite数据库
    ViewPager基础入门
    调用android方法,出现版本太低解决方法
    Android Studio 代码自动提示无效
    策略模式
    C#通过SendARP()获取WinCE设备的Mac网卡物理地址
    简单理解和使用 C# 委托与事件
    Oracle SQL developer客户端 如何连接已经安装完毕的Oracle服务器端
    源码分析之Map(二)HashCode详解
  • 原文地址:https://www.cnblogs.com/-wenli/p/12235777.html
Copyright © 2011-2022 走看看