python 定时器 timer QTimer
需求背景:
一秒记录一个数据,数据从仪器读取,经过一系列的操作后记录到csv文件(该过程从发命令到成功写入CSV需要的操作时间不等,从几毫秒到几百毫秒),记录时间一天左右!
==========================================================================
第一次实现 使用 time.sleep()
1 import time 2 import datetime 3 4 def hello(): 5 now = datetime.datetime.now() 6 print(str(now)) 7 fh = open("test.csv",'a') 8 fh.write(str(now)) 9 fh.write('\n') 10 fh.flush() 11 time.sleep(0.1) #模拟实际代码执行时间
13 if __name__ == "__main__":
14 while True:
15 hello()
16 time.sleep(1)
结果:
从上图中看出,这不合要求,少了15:37:04 时刻的数据,因为每次循环,代码执行的时间都在累加,导致实际记录间隔是 1s+代码执行时间。
第二次实现 python Timer 定时器
补充Timer知识点
class threading.
Timer
(interval, function, args=[], kwargs={})
Create a timer that will run function with arguments args and keyword arguments kwargs, after interval seconds have passed.
For example:
def hello():
print "hello, world"
t = Timer(30.0, hello)
t.start() # after 30 seconds, "hello, world" will be printed
通过测试这里最大的问题是,hello()只执行一次,但实际要的效果是每隔1s连续不断的执行hello(),于是通过百度找到下面方法:
import threading import time import datetime def hello(uut_dev,cmd): now = datetime.datetime.now() print(str(now)) fh = open("test.csv",'a') fh.write(str(now)) fh.write('\n') fh.flush() time.sleep(0.2) #模拟实际代码执行时间 t1 = threading.Timer(1, hello,("uut_dev","FETCH?\r\n")) t1.start() if __name__ == "__main__": t1 = threading.Timer(1, hello,("uut_dev","FETCH?\r\n")) t1.start()
代码执行结果:
很明显又是一次不合格的数据,于是又想了下面的方法:
1 import threading 2 import time 3 import datetime 4 5 def hello(uut_dev,cmd): 6 now = datetime.datetime.now() 7 print(str(now)) 8 fh = open("test.csv",'a') 9 fh.write(str(now)) 10 fh.write('\n') 11 fh.flush() 12 time.sleep(0.2) 13 14 if __name__ == "__main__": 15 while True: 16 t1 = threading.Timer(0, hello,("uut_dev","FETCH?\r\n")) 17 t1.start() 18 time.sleep(1)
执行结果:
从结果看出,效果好了很多,但每次执行还是多了大概3ms,很明显要是执行的时间足够长肯定还是会有记录误差
第三次实现 pyqt QTimer 定时器
1 import sys 2 import datetime 3 import time 4 from PyQt4.QtGui import * 5 from PyQt4.QtCore import * 6 7 def hello(): 8 now = datetime.datetime.now() 9 print(str(now)) 10 fh = open("test.csv",'a') 11 fh.write(str(now)) 12 fh.write('\n') 13 fh.flush() 14 time.sleep(0.2) 15 16 if __name__ == "__main__": 17 app = QApplication(sys.argv) 18 timer = QTimer() 19 QObject.connect(timer,SIGNAL("timeout()"), hello) 20 timer.start(1000) 21 sys.exit(app.exec_())
执行结果:
好像就是需要的效果,虽然每次执行有几毫秒的误差,但能保证长时间的1s一次记录