VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • wxPython使用delayedresult进行耗时计算(2)

 

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

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

相关教程