Home | History | Annotate | Download | only in pyautolib
      1 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import copy
      6 import threading
      7 import time
      8 
      9 class TimerQueue(threading.Thread):
     10   """Executes timers at a given interval.
     11 
     12   This class provides the ability to run methods at a given interval.  All
     13   methods are fired synchronously.  Only one method is running at a time.
     14 
     15   Example of using TimerQueue:
     16     def _fooPrinter(word):
     17       print('foo : %s' % word)
     18 
     19     timers = TimerQueue()
     20     timers.addTimer(self._fooPrinter, 15, args=('hello',))
     21     timers.start()
     22 
     23   >> hello will be printed after 15 seconds
     24 
     25   Note: TimerQueue is a subclass of threading.Thread, call start() to activate;
     26   do not call run() directly.
     27   """
     28 
     29   def __init__(self):
     30     """Initializes a TimerQueue object."""
     31     threading.Thread.__init__(self, name='timer_thread')
     32     self.timer_queue_lock = threading.Lock()
     33     self.terminate = False
     34     self.wait_time = 1
     35     self.timers = []
     36 
     37   def AddTimer(self, method, interval, args=()):
     38     """Adds a timer to the queue.
     39 
     40     Args:
     41       method: the method to be called at the given interval
     42       interval: delay between method runs, in seconds
     43       args: arguments to be passed to the method
     44     """
     45     self.timer_queue_lock.acquire()
     46     next_time = time.time() + interval
     47     self.timers.append({'method': method, 'interval': interval,
     48                         'next time': next_time, 'args': copy.copy(args)})
     49     self.timer_queue_lock.release()
     50 
     51   def SetResolution(self, resolution):
     52     """Sets the timer check frequency, in seconds."""
     53     self.wait_time = resolution
     54 
     55   def RemoveTimer(self, method):
     56     """Removes a timer from the queue.
     57 
     58     Args:
     59       method: the timer containing the given method to be removed
     60     """
     61     self.timer_queue_lock.acquire()
     62     for timer in self.timers:
     63       if timer['method'] == method:
     64         self.timers.remove(timer)
     65         break
     66     self.timer_queue_lock.release()
     67 
     68   def Stop(self):
     69     """Stops the timer."""
     70     self.terminate = True
     71 
     72   def run(self):
     73     """Primary run loop for the timer."""
     74     while True:
     75       now = time.time()
     76       self.timer_queue_lock.acquire()
     77       for timer in self.timers:
     78         if timer['next time'] <= now:
     79           # Use * to break the list into separate arguments
     80           timer['method'](*timer['args'])
     81           timer['next time'] += timer['interval']
     82       self.timer_queue_lock.release()
     83       if self.terminate:
     84         return
     85       time.sleep(self.wait_time)
     86