监测数据采集物联网应用开发步骤(5.3)
定时器插件化开发
在com.zxy.common.Com_Para.py中添加如下内容
#定时器正在运行标签
bTimeFlag = False
#定时器插件拦截器
TimeREFLECT_IN_CLASS = "com.plugins.usereflect.testCustTimeReflectClass1"
创建自定义定时器执行类com.zxy.taskhandler.TimeTask.py
#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''import datetime,importlib,threading,time
from com.zxy.common import Com_Para
from com.zxy.z_debug import z_debug#监测数据采集物联网应用--自定义定时器
class TimeTask(z_debug):# rundatetime固定时间执行 delay延迟多少秒一次性执行 Interval定时循环执行sleeps(时间)def __init__(self, rundatetime, delay, Interval, sleeps, sname):self.rundatetime = rundatetimeself.delay = delayself.Interval = Intervalself.sleeps = sleepsself.sname = sname# 定时执行程序def stimedo(self):Com_Para.bTimeFlag = Trueself.runTask()Com_Para.bTimeFlag = False#线程调用def run(self):t = threading.Thread(target=self.show, name=self.sname)t.start()#插件类反射调用def RunReflectInClass(self):#定时任务拦截器if Com_Para.TimeREFLECT_IN_CLASS != "":try:objC = importlib.import_module(Com_Para.TimeREFLECT_IN_CLASS) #对模块进行导入 objName = Com_Para.TimeREFLECT_IN_CLASS.split(".")objN = getattr(objC,objName[len(objName) - 1])if hasattr(objN,"strContinue"):#传入参数#setattr(objN,"strResult",strResult)fun_us = getattr(objN,"init_start")fun_us(objN)#获取参数#temResult = getattr(objN,"strResult")#temContinue = getattr(objN,"strContinue")except Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息finally:pass#执行任务def runTask(self): try: #定时器插件调用self.RunReflectInClass()except Exception as e:if str(type(self)) == "<class 'type'>":self.debug_in(self,repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息else:self.debug_in(repr(e)+"=>"+str(e.__traceback__.tb_lineno))#打印异常信息finally:passdef show(self):starttime = datetime.datetime.now()#固定时间开始执行if self.rundatetime != 0 :while True:starttime = datetime.datetime.now()if starttime > self.rundatetime and not Com_Para.bTimeFlag :self.stimedo()breakelse:time.sleep(self.sleeps)#延迟多少秒执行if self.delay != 0:endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.delay)while True:starttime = datetime.datetime.now()if starttime >= endtime and not Com_Para.bTimeFlag:self.stimedo()breakelse:time.sleep(self.sleeps)#定时循环执行if self.Interval != 0:endtime = starttime + datetime.timedelta(seconds=self.Interval)while True:starttime = datetime.datetime.now()if starttime >= endtime and not Com_Para.bTimeFlag:if starttime >= (endtime + datetime.timedelta(seconds=self.Interval)):endtime = endtime + 2*datetime.timedelta(seconds=self.Interval)else:endtime = endtime + datetime.timedelta(seconds=self.Interval)self.stimedo()elif endtime > (starttime + datetime.timedelta(seconds=10 * self.Interval)):endtime = datetime.datetime.now() + datetime.timedelta(seconds=self.Interval)else:time.sleep(self.sleeps)
创建定时器插件1 com.plugins.usereflect.testCustTimeReflectClass1.py
#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''from com.zxy.z_debug import z_debug
from com.zxy.common.Com_Fun import Com_Fun#监测数据采集物联网应用--定时器插件1
class testCustTimeReflectClass1(z_debug):#是否继续执行定时器 1:继续执行 0:中断执行strContinue = "1" #数据,传入参数strResult = ""def __init__(self, params):passdef init_start(self):self.strResult = "定时器1111执行任务数据输出:"+Com_Fun.GetTimeDef()print(self.strResult)
创建定时器插件2 com.plugins.usereflect.testCustTimeReflectClass2.py
#! python3
# -*- coding: utf-8 -
'''
Created on 2017年05月10日
@author: zxyong 13738196011
'''from com.zxy.z_debug import z_debug
from com.zxy.common.Com_Fun import Com_Fun#监测数据采集物联网应用--定时器插件2
class testCustTimeReflectClass2(z_debug):#是否继续执行定时器 1:继续执行 0:中断执行strContinue = "1" #数据,传入参数strResult = ""def __init__(self, params):passdef init_start(self):self.strResult = "定时器2222执行任务数据输出:"+Com_Fun.GetTimeDef()print(self.strResult)
定时器测试案例MonitorDataCmd.py主文件中编写:
from com.zxy.taskhandler.TimeTask import TimeTask
在主文件中定义线程测试类
#定义线程测试类
class ThreadTest(object):#定义线程更改定时器插件类def ChangeTimeREFLECT(self):time.sleep(13)Com_Para.TimeREFLECT_IN_CLASS = "com.plugins.usereflect.testCustTimeReflectClass2"if __name__ == '__main__':下编写#定时器执行案例,定义定时器插件类名Com_Para.TimeREFLECT_IN_CLASS = "com.plugins.usereflect.testCustTimeReflectClass1"# #固定时间执行,当前时间延迟25秒
# times = Com_Fun.DateTimeAdd(datetime.datetime.now(),"S",25)
# print("定时器固定时间执行开始:"+Com_Fun.GetTimeDef())
# tt = TimeTask(times, 0, 5, 0.1, "TimeTask")
# tt.run()# #当前时间延迟15秒
# print("定时器延迟15秒执行开始:"+Com_Fun.GetTimeDef())
# tt = TimeTask(0, 15, 5, 0.1, "TimeTask")
# tt.run()# print("定时器循环秒执行开始:"+Com_Fun.GetTimeDef())
# tt = TimeTask(0, 0, 5, 0.1, "TimeTask")
# tt.run()
#
# #延迟13秒变更定时器插件试试
# trt = ThreadTest()
# t = threading.Thread(target=trt.ChangeTimeREFLECT, name="zxyong_ChangeTimeREFLECT")
# t.start()
测试请将对应注释取消
固定时间执测试结果1:
延迟时间执行测试结果2:
执行13秒之后变更定时器插件测试结果3:
- 监测数据采集物联网应用开发步骤(7)