उपर्युक्त पोस्ट से प्रेरित। पायथन में रद्द करने योग्य और टाइमर रीसेट करना। यह धागा का उपयोग करता है।
विशेषताएं: प्रारंभ करें, रोकें, पुनरारंभ करें, कॉलबैक फ़ंक्शन।
इनपुट: टाइमआउट, sleep_chunk मान, और callback_function।
किसी भी अन्य कार्यक्रम में इस वर्ग का उपयोग या वारिस कर सकते हैं। कॉलबैक फ़ंक्शन में तर्क भी पास कर सकते हैं।
टाइमर को भी मध्य में जवाब देना चाहिए। पूर्ण नींद के समय के पूरा होने के बाद ही नहीं। तो नींद के छोटे हिस्सों का उपयोग करके, एक पूर्ण नींद का उपयोग करने के बजाय और लूप में ईवेंट ऑब्जेक्ट की जांच करना जारी रखा।
import threading
import time
class TimerThread(threading.Thread):
def __init__(self, timeout=3, sleep_chunk=0.25, callback=None, *args):
threading.Thread.__init__(self)
self.timeout = timeout
self.sleep_chunk = sleep_chunk
if callback == None:
self.callback = None
else:
self.callback = callback
self.callback_args = args
self.terminate_event = threading.Event()
self.start_event = threading.Event()
self.reset_event = threading.Event()
self.count = self.timeout/self.sleep_chunk
def run(self):
while not self.terminate_event.is_set():
while self.count > 0 and self.start_event.is_set():
# print self.count
# time.sleep(self.sleep_chunk)
# if self.reset_event.is_set():
if self.reset_event.wait(self.sleep_chunk): # wait for a small chunk of timeout
self.reset_event.clear()
self.count = self.timeout/self.sleep_chunk # reset
self.count -= 1
if self.count <= 0:
self.start_event.clear()
#print 'timeout. calling function...'
self.callback(*self.callback_args)
self.count = self.timeout/self.sleep_chunk #reset
def start_timer(self):
self.start_event.set()
def stop_timer(self):
self.start_event.clear()
self.count = self.timeout/self.sleep_chunk # reset
def restart_timer(self):
# reset only if timer is running. otherwise start timer afresh
if self.start_event.is_set():
self.reset_event.set()
else:
self.start_event.set()
def terminate(self):
self.terminate_event.set()
#=================================================================
def my_callback_function():
print 'timeout, do this...'
timeout = 6 # sec
sleep_chunk = .25 # sec
tmr = TimerThread(timeout, sleep_chunk, my_callback_function)
tmr.start()
quit = '0'
while True:
quit = raw_input("Proceed or quit: ")
if quit == 'q':
tmr.terminate()
tmr.join()
break
tmr.start_timer()
if raw_input("Stop ? : ") == 's':
tmr.stop_timer()
if raw_input("Restart ? : ") == 'r':
tmr.restart_timer()
यह _almost_ अच्छा है। यह * अच्छा * होगा यदि आपका प्रोग्राम तत्काल समाप्त नहीं हुआ, एक "हैलो" के साथ और कोई देरी नहीं! :) आपको कुछ कंडिशन के आधार पर 'say.cello()' फ़ंक्शन में 't.cancel()' को शामिल करना होगा, उदा। 'अगर काउंटर == 10: टी.cancel()'। इसके बाद इसका अर्थ होगा। – Apostolos
क्षमा करें। तब भी यह अच्छा नहीं होगा। यदि आप 'SayHello (0)' को कॉल करने के बाद कोई कोड जोड़ते हैं, तो टाइमर परीक्षण समाप्त होने से पहले इसे निष्पादित किया जाएगा! (अपने कोड के अंत में 'प्रिंट "हो गया" जोड़कर इसे स्वयं आज़माएं।) – Apostolos