2 #A part of NonVisual Desktop Access (NVDA)
\r
3 #Copyright (C) 2006-2007 NVDA Contributors <http://www.nvda-project.org/>
\r
4 #This file is covered by the GNU General Public License.
\r
5 #See the file COPYING for more details.
\r
8 from Queue import Queue
\r
10 from logHandler import log
\r
14 eventQueue.__name__="eventQueue"
\r
16 lastGeneratorObjID=0
\r
18 def registerGeneratorObject(generatorObj):
\r
19 global generators,lastGeneratorObjID
\r
20 if not isinstance(generatorObj,types.GeneratorType):
\r
21 raise TypeError('Arg 2 must be a generator object, not %s'%type(generatorObj))
\r
22 lastGeneratorObjID+=1
\r
23 log.debug("Adding generator %d"%lastGeneratorObjID)
\r
24 generators[lastGeneratorObjID]=generatorObj
\r
25 return lastGeneratorObjID
\r
27 def cancelGeneratorObject(generatorObjID):
\r
30 del generators[generatorObjID]
\r
34 def queueFunction(queue,func,*args,**kwargs):
\r
35 queue.put_nowait((func,args,kwargs))
\r
37 def isRunningGenerators():
\r
38 res=len(generators)>0
\r
39 log.debug("generators running: %s"%res)
\r
41 def flushQueue(queue):
\r
42 for count in range(queue.qsize()+1):
\r
43 if not queue.empty():
\r
44 (func,args,kwargs)=queue.get_nowait()
\r
47 func(*args,**kwargs)
\r
49 log.exception("Error in func %s from %s"%(func.__name__,queue.__name__))
\r
51 def isPendingItems(queue):
\r
52 if not queue.empty():
\r
59 # This dict can mutate during iteration, so use keys().
\r
60 for ID in generators.keys():
\r
61 # KeyError could occur within the generator itself, so retrieve the generator first.
\r
63 gen = generators[ID]
\r
65 # Generator was cancelled. This is fine.
\r
70 except StopIteration:
\r
71 log.debug("generator %s finished"%ID)
\r
74 log.exception("error in generator %d"%ID)
\r
76 flushQueue(eventQueue)
\r