Changeset 722

Show
Ignore:
Timestamp:
10/14/03 14:45:38 (5 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBFoundation/RBFoundation/ThreadTools.py

    r642 r722  
    3333class DispatchThread(threading.Thread): 
    3434    def __init__(self): 
    35         self.workqueue = Queue.Queue(0) 
    36         self.thread = threading.Thread(None, self._OnThreadExecute) 
    37         self.thread.setDaemon(True) 
     35        threading.Thread.__init__(self) 
     36        self.workqueue = self._QueueFactory() 
     37        self.setDaemon(True) 
     38        self.start() 
    3839 
    3940    def CallLater(self, callable, *args, **kw): 
    40         self.workqueue.put((callable, args, kw), True) 
    41         if not self.thread.isAlive(): 
    42             self.thread.start() 
     41        self._AddWork((callable, args, kw)) 
    4342 
    44     def _OnThreadExecute(self): 
     43    def run(self): 
    4544        self._running = True 
    4645        while self._running: 
    47             callable, args, kw = self.workqueue.get(True
     46            callable, args, kw = self._GetWork(
    4847            if callable is not None: 
    4948                callable(*args, **kw) 
    5049            else: break 
     50    def stop(self): 
     51        self._running = False 
    5152 
     53    def _AddWork(self, item): 
     54        return self.workqueue.put(item, True) 
     55    def _GetWork(self): 
     56        return self.workqueue.get(True) 
     57    def _QueueFactory(self): 
     58        return Queue.Queue(None) 
     59 
     60#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     61 
     62class DictQueue(Queue.Queue): 
     63    def _init(self, maxsize=None): 
     64        self.maxsize = maxsize 
     65        self.queue = dict() 
     66 
     67    def _put(self, item): 
     68        self.queue[item[0]] = item[1] 
     69 
     70    def _get(self): 
     71        return self.queue.popitem() 
     72 
     73class DictDispatchThread(DispatchThread): 
     74    def CallLater(self, dispatchkey, callable, *args, **kw): 
     75        self._AddWork((dispatchkey, (callable, args, kw))) 
     76 
     77    def _QueueFactory(self): 
     78        return DictQueue() 
     79 
     80    def _GetWork(self): 
     81        return self.workqueue.get(True)[-1] 
     82