| OLD | NEW |
| (Empty) |
| 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) | |
| OLD | NEW |