注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

在wxPython中使用多线程  

2015-11-17 00:36:20|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
wxPython是GUI库,一般GUI库都是只能在主线程中渲染。而渲染引擎现在只有两个一个是微软的Directx,一个就是开源Api的OpenGL。OpenGL是不支持多线程的,Directx我就不知道了,基本上没有接触过.
Python本身有一个threading的多线程库,非常好用。
同时还有一个线程安全的列队库Queue。使用Quete列队,就可以在多个线程之间传递消息了。
如果要使用wxPython作比较复杂的GUI应用程序,你可以使用上边的Queue来处理线程间的消息,可以给主线程定义两个列队,一个用来接收来自其他子线程的消息,一个用来给其他子线程发送数据.同时还可以使用我上一遍文章中的threading.Event()在主线程或者其他线程中启动另一个线程.这样作之后,我们就可以把和GUI无关的所有工作都放在别的线程处理,只在主线程进行GUI相关的显示数据绘制.
wxPython有一个子线程调用主线程UI控件的方法wx.CallAfter(),子线程调用这个方法之后,主线程的UI可以在当前事件处理结束后处理子线程发送的消息,这是wxPython中子线程给主线程发送消息最简单的方法了。
看的一个关于wxPython教程中给出了一个例子:

#!/usr/bin/env python

# -*- coding: 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.

    '''

    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 stop(self): 

        self.timeToQuit.set()

    def run(self):#运行一个线程

        msg = 'Thread %d iterating %d times with a delay of %1.4f\n'%(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\n' % (i, self.threadNum) 

            wx.CallAfter(self.window.LogMessage, msg)

        else:

            wx.CallAfter(self.window.ThreadFinished, self)

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.PySimpleApp() 

frm = MyFrame() 

frm.Show() 

app.MainLoop()


下边是运行结果截图:

在wxPython中使用多线程 - ♂苹果 - 眼睛想旅行

 

  评论这张
 
阅读(242)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017