`
t289571130c
  • 浏览: 15803 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

线程执行wxPython使用delayedresult进行耗时处理 线程执行

阅读更多

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    

delayedresult应用背景绍介

    在行进wxPython GUI画面编程时,如直接在画面主线程行进大批耗时算计处置,就会成造画面假死,不能响应用户输入。

    应用wxPython的delayedresult块模,可省力处理该问题,甚至都不需要懂得相干线程处置机制,可即便方的把耗时处置放到独单的线程中,处置结束后把结果返回GUI画面主线程,并调用先预义定的相干处置,行进画面更新等。

    

为了演示delayedresult的应用情况,先新建一TestWindow框架,doSomeThing()是我们模拟行进大批耗时处置的数函。 

 1 import wx
 2 from wx.lib.delayedresult import startWorker
 3 import threading
 4 
 5 class TestWindow(wx.Frame):
 6     def __init__(self, title='Test Window'):
 7         self.app = wx.App(False)
 8         wx.Frame.__init__(self, None, -1, title)
 9         panel = wx.Panel(self)
10         self.btnBegin = wx.Button(panel, -1, label='Begin')
11         self.Bind(wx.EVT_BUTTON, self.handleButton, self.btnBegin)
12         self.txtCtrl = wx.TextCtrl(panel, style=wx.TE_READONLY, size=(300, -1))
13         vsizer = wx.BoxSizer(wx.VERTICAL)
14         vsizer.Add(self.btnBegin, 0, wx.ALL, 5)
15         vsizer.Add(self.txtCtrl, 0, wx.ALL, 5)
16         panel.SetSizer(vsizer)
17         vsizer.SetSizeHints(self)
18         self.Show()
19 
20     #处置Begin按钮件事
21     def handleButton(self, event):
22         self.workFunction()
23 
24     #开始执行耗时处置,有继承类实现
25     def workFunction(self, *args, **kwargs):
26         print'In workFunction(), Thread=', threading.currentThread().name
27         print '\t*args:', args
28         print '\t**kwargs:', kwargs
29         
30         self.btnBegin.Enable(False)
31 
32     #耗时处置处置成完后,调用该数函执行画面更新示显,由继承类实现
33     def consumer(self, delayedResult, *args, **kwargs):
34         print 'In consumer(), Thread=', threading.currentThread().name
35         print '\tdelayedResult:', delayedResult
36         print '\t*args:', args
37         print '\t**kwargs:', kwargs
38 
39         self.btnBegin.Enable(True)
40 
41     #模拟行进耗时处置并返回处置结果,给继承类应用
42     def doSomeThing(self, *args, **kwargs):
43         print'In doSomeThing(), Thread=', threading.currentThread().name
44         print '\t*args:', args
45         print '\t**kwargs:', kwargs
46         
47         count = 0
48         while count < 10**8:
49             count += 1
50             
51         return count

行运面界:

    

 

    

先看看如在GUI画面主线程行进doSomeThing()处置的

 1 class DoSomeThingInGUI(TestWindow):
 2     def __init__(self):
 3         TestWindow.__init__(self, 'Do Something In GUI Thread')
 4         self.app.MainLoop()
 5 
 6     #执行doSomeThing(),并在执行成完后,动主调用consumer()更新画面示显
 7     def workFunction(self, *args, **kwargs):
 8         TestWindow.workFunction(self, args, kwargs)
 9         var = self.doSomeThing()
10         self.consumer(var)
11 
12     def consumer(self, delayedResult, *args, **kwargs):
13         TestWindow.consumer(self, delayedResult, args, kwargs)
14         self.txtCtrl.SetValue(str(delayedResult))
15         
16 if __name__ == '__main__':
17     win = DoSomeThingInGUI()

执行后,点Begin开始后,直到处置成完画面口窗没法动移。

    由以下log出输可以晓得,处置都是在GUI画面主线程中成完的。

    In workFunction(), Thread= MainThread
*args: ((), {})
**kwargs: {}
In doSomeThing(), Thread= MainThread
*args: ()
**kwargs: {}
In consumer(), Thread= MainThread
delayedResult: 100000000
*args: ((), {})
**kwargs: {}

 

    

应用wx.lib.delayedresult后的处置情况:

 1 class DoSomeThingInSeperateThread(TestWindow):
 2     def __init__(self):
 3         TestWindow.__init__(self, 'Do Something In Seperate Thread')
 4         self.jobId = 100
 5         self.app.MainLoop()
 6 
 7     #调用wx.lib.delayedresult.startWorker,把数函处置放到独单的线程中去成完。
 8     #成完后会动主调用consumer行进画面更新处置
 9     #startWorker数函的各数参接下来分析
10     def workFunction(self, *args, **kwargs):
11         TestWindow.workFunction(self, args, kwargs)
12         startWorker(self.consumer, self.doSomeThing, jobID=self.jobId)
13 
14     #第一数参要为DelayedResult类型,即含包处置结果或常异息信,调用get口接获得。
15     def consumer(self, delayedResult, *args, **kwargs):
16         TestWindow.consumer(self, delayedResult, args, kwargs)
17         assert(self.jobId == delayedResult.getJobID())
18         try:
19             var = delayedResult.get()
20         except Exception, e:
21             print 'Result for job %s raised exception:%s' %(delayedResult.getJobID, e)
22                 
23         self.txtCtrl.SetValue(str(var))
24         
25 if __name__ == '__main__':
26     win = DoSomeThingInSeperateThread()

执行后,点Begin开始后,口窗动移不受影响,也就是说处置是异步的。

    由以下log出输可以晓得,耗时处置doSomeThing是在独立线程行运的。

    处置成完后的画面更新处置consumer还是在GUI画面主线程成完的。

    In workFunction(), Thread= MainThread
*args: ((), {})
**kwargs: {}
In doSomeThing(), Thread= 100
*args: ()
**kwargs: {}
In consumer(), Thread= MainThread
delayedResult: <wx.lib.delayedresult.DelayedResult instance at 0x02FFE828>
*args: ((), {})
**kwargs: {}

 

    

startWorker数函绍介

    该数函创立独立线程(Producer线程)执行workerFn(*wargs, **wkwargs),并将其结果发送给行运在Main线程的consumer(*cargs, ckwargs)。

    jobID即为创立的Producer线程的名字,也可在consumer中判断是那个Producer线程。

    具体可考参 help(wx.lib.delayedresult)

startWorker(consumer,
            workerFn,
            cargs=(), ckwargs={},
            wargs=(), wkwargs={},
            jobID=None,
            group=None,
            daemon=False,
            sendReturn=True,
            senderArg=None)

注意事项:

    1)sendResurn为True的情况下,workFn执行结束后才执行consumer处置。

    2)consumer第一数参为DelayedResult,可应用其结果get()获得workFn中返回的结果,getJobID()用于返回数参jobID或者None(jobID未指定时)

    3)cargs, ckwargs传递给consumer;wargs, wkargs传递给workerFn

文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

分享到:
评论

相关推荐

    PyQt5中多线程模块QThread和线程池ThreadPoolExecutor解决PyQt5界面程序执行比较耗时操作无响应问题

    1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题,采用线程池ThreadPoolExecutor解决了ping多个IP多任务耗时问题。...

    Python GUI制作实例 wxPython使用多线程 防假死含wxFormBuilder的文件及源码.rar

    在GUI应用中,主线程负责更新界面,而其他线程可以执行耗时操作。这样,即使后台任务在运行,用户仍能继续与界面交互。在这个实例中,`ebom2.py`可能利用了多线程技术来防止程序在执行某些操作时阻塞用户界面。 `...

    分析Python编程时利用wxPython来支持多线程的方法

    为了避免这种情况,多线程技术允许程序在后台线程中处理耗时任务,而主线程可以继续处理用户的输入和其他界面更新,从而提升用户体验。 wxPython是一个扩展了wxWidgets的Python封装库,它为Python提供了丰富的GUI...

    wxpython多线程防假死与线程间传递消息实例详解

    在学习wxpython开发GUI应用程序时,多线程编程是一个非常重要的概念,尤其是在需要执行耗时操作而不阻塞主事件循环的情况下。多线程编程的一个关键挑战是如何防止线程假死,同时确保线程间能够有效传递消息。本文将...

    多线程进度条(事件触发)

    主线程通常负责用户界面的交互,而额外的线程则处理后台任务,如数据加载或计算。在C#中,我们可以使用`System.Threading`命名空间中的`Thread`类或者`Task`类来创建新的线程。`Task`类更现代化,支持异步编程模型,...

    wxPython开发参考书籍

    2. **性能优化**: 避免在事件处理中进行耗时操作,考虑使用异步编程或后台线程。 3. **界面设计原则**: 遵循用户习惯,保持界面简洁,提供良好的用户体验。 4. **错误处理**: 适当添加异常处理,提高程序的健壮性。 ...

    多线程进度条控制基本方法演示

    在IT领域,多线程编程是一项关键技能,尤其是在开发用户界面或者进行大量计算时。进度条控制是用户体验的重要组成部分,它能提供任务执行状态的视觉反馈,帮助用户了解程序运行情况。本文将深入探讨如何在多线程环境...

    线程遍历文件下文件

    在编程领域,线程遍历文件下文件是一个常见的任务,特别是在处理大量数据或者需要实时更新文件系统状态的应用中。这个任务通常涉及到多线程技术、文件I/O操作以及用户界面的交互。以下是对这个主题的详细说明: 1. ...

    wxpython源代码

    7. **多线程**:在一些复杂的应用程序中,可能需要使用多线程来处理耗时任务,避免阻塞用户界面。`wx.Threading` 模块提供了在 `wxPython` 中使用多线程的接口。 8. **国际化与本地化**:`wx.Locale` 和 `wx....

    wxPython实战——高清中文版

    还会涉及多线程技术,以便在不阻塞用户界面的情况下执行耗时操作。此外,可能还会讲解如何利用wxTaskBarIcon创建任务栏图标,提供系统级别的通知。 ### 实战项目 书中很可能会包含一些实战项目,如构建一个简单的...

    动态显示进程执行进度

    在编程领域,动态显示进程执行进度是一个非常实用的技术,它能提供用户友好的界面体验,让用户了解程序执行的状态,特别是处理耗时任务时。本文将深入探讨如何实现进程进度条,并提供一个最佳实践的例子。 首先,...

    使用Python掌握GUI编程_Python_下载.zip

    6. **多线程与异步编程**:在GUI编程中,为了保持界面的响应性,通常需要将耗时的操作放在后台线程执行。这部分可能会教你如何使用Python的线程和异步编程技术。 7. **打包与部署**:如何将你的GUI程序打包成可执行...

    python-wxpython4

    9. **多线程支持**:允许在GUI线程外执行耗时任务,避免界面冻结。 10. **Phoenix版本改进**:与旧版相比,Phoenix版本修复了许多bug,提升了性能,改进了内存管理,并引入了新的控件和样式。 在"python-wxpython4...

    第14章 创建图形用户界面GUI.ppt6.zip.zip

    6. 多线程:如果GUI需要响应用户交互并执行耗时任务,理解如何使用多线程以保持界面的响应性是重要的。 7. 国际化与本地化:对于大型应用,支持不同语言和文化的GUI设计是必要的。 8. UI设计原则:如一致性、反馈...

    gui管理系统gui管理系统

    主线程负责处理用户界面,后台线程则处理耗时任务,避免了用户界面的冻结。 6. **错误处理和调试**:GUI管理系统需要考虑异常处理和用户体验,如弹出友好的错误提示框,提供清晰的错误日志,便于开发者定位和解决...

    Python技术图形化编程注意事项.docx

    - **异步处理**:对于耗时较长的任务,应考虑使用线程或异步机制来处理,以免阻塞界面。 #### 四、避免界面阻塞 在图形化编程中,界面阻塞是一个常见的问题,特别是当应用程序执行一些耗时的操作时(如大量数据...

    Python界面程序开发应用技术.zip

    7. **多线程与异步编程**:在GUI程序中,为了保证界面的响应性,通常需要将耗时操作放在后台线程执行。了解如何使用`threading`模块进行多线程编程,或使用`asyncio`进行异步操作,是提高用户体验的重要技巧。 8. *...

    完整版读取文件并显示进度.rar

    综上所述,"完整版读取文件并显示进度"涉及了多种IT技术,包括I/O操作、大文件处理策略、用户界面反馈、多线程编程、事件驱动编程、错误处理以及性能优化。这些知识点在实际项目开发中都是不可或缺的部分,对于提升...

    GUI-3.zip_源码

    1. 多线程:在GUI应用中,为了保持界面的响应性,通常会将耗时操作放在后台线程执行,避免阻塞主线程。这涉及到线程同步和通信,如信号量、条件变量、队列等。 2. 自定义控件:除了标准的GUI组件,有时需要创建...

Global site tag (gtag.js) - Google Analytics