key word:
how to customized a suitable timer in python
因为项目需要,需要使用python 定时器, 在谷歌一番之后,基本获得的信息是调用python 的 threading的timer 定时器, 或者使用schl 模块进行操作。 具体实践方法请自行谷歌之。
在一番调试之后,发现threading timer 定时器不好控制, 相关资料少,用的不明就里 (个人才疏德浅, 有用的好的同学,欢迎指教。O(∩_∩)O哈哈~)尤其是需要同时启动多个定时器之后,整个程序跑的一团浆糊。
经过一番地毯式搜索依旧没有找到很好的解决方案之后,始终没有找到一个现成,满意的的快速解决方案。我不得的陷入沉思
根据我搜索的数据分析,所有的定时器都提到了一个词: 线程。 这引发我对自行定制定时器的想法,这个想法很快在我发酵延伸
目标:
我需要的定时器的功能很简单, 有点类似VC 当中的settimer()
1 能够设定准确的延时时间, 时间误差不超过10 ms 都是可接受的。
2 在定时timeout 之后,会自动触发用户函数进行响应
3 定时器可设置是否循环操作,比如每隔2 秒自动刷新一次
4 可强制kill 定时器
在明确了自身对 定时器的需求之后,对定时器所要求的基本功能也就明确了
通过自建一个线程类并且开始计时,timeout 之后,自动执行设定函数。
现有的定时器虽然不好搞,缺乏相关资料,但是线程确实非常熟悉的。
请看代码:
import threading
import time
定时器类
class Pysettimer(threading.Thread):
'''
Pysettimer is simulate the C++ settimer ,
it need pass funciton pionter into the class ,
timeout and is_loop could be default , or customized
'''
def __init__(self, function, args=None,timeout=1,is_loop=False):
threading.Thread.__init__(self)
self.event=threading.Event()
# inherent the funciton and args
self.function=function
self.args=args # pass a tuple into the class
self.timeout=timeout
self.is_loop=is_loop
def run(self):
while not self.event.is_set():
self.event.wait(self.timeout) # wait until the time eclipse
self.function(self.args)
if not self.is_loop:
self.event.set()
def stop(self):
self.event.set()
为了测试我们的定时器是否能够正常工作, 定义一个测试函数:
def functest(args):
print 'hello world , this is ' , args[0] #
测试函数的形参统一设定为一个元组。 设置元组原因:
1 元组对数据具有不可修改的保护特性
2 元组可适应动态,多参数传递的需求。将传递的参数统一打包处理, 无需对 Pysettimer() 类接口进行修改
运行测试函数:
#==================================================
def main():
mytime=Pysettimer(functest, ('python ' ,'program ')) #multiple ,dynamic argument wouldnot affect Pysettimer class API port
mytime.start()
time.sleep(10) # append the main thread
mytime.stop() # end the timer thread .
print 'time over'
if __name__=='__main__':
main()
附上源文件及模块调用方法:
http://download.csdn.net/detail/hesiyuan4/6929521