设置定时器定时值
支持芯片: SHMICTRL系列芯片 ESP32-S3系列
void settimer(int ts)
//ts: 时间,单位10ms =0表示关闭定时器
示例
settimer(100); //定时1秒 100*10ms=1000ms=1s
注意
- settimer执行后,立即开始计时
- 当到达时间后,可能事件触发会有延时,比如预设200ms,在计时器达到200ms的时候,此时如果界面正在刷新,为保证界面操作的连贯性,不卡,此时中断不响应,待界面刷新完后再相应定时器中断,因此可能在200多ms的时候相应定时时间,比如:
时间轴 | 情况 |
---|---|
0ms | 设置定时器20,即200ms |
200ms时 | 定时值到达,系统绘制界面busy; 未响应定时器事件 |
220ms | 相应定时器事件,定时器事件中未使用settimer从新设置 |
400ms | 定时值到达,注意不是420ms才到达 |
- 当控件没有设置定时器启动的情况下,此语句会自动设置定时器,因此此控件必须有ontimer()的方法
- 定时器是控件内部属性,因此本语句只能放在控件事件内部的代码中(方法、事件、继承事件函数内均可使用),在全局代码中执行会出错
实际案例
由于settimer函数没有在参数中指定是哪一个控件,因此默认为设置当前控件的定时器参数,但是由于页面内控件的继承导致当前控件可能被重新指定,因此这个需要编程时注意;比如下例:
//界面中有s3 s4 两个按钮
void s3.onclick()
{
s4.show(); //此时,在s3的事件中调用s4的方法
settimer(50); //此时当前控件指的是s4,而不是s3,因此设置的是s4的定时器的值
}
void s3.ontimer()
{
echo("S3");
}
void s4.ontimer()
{
echo("S4");
}
本代码的运行结果会不断的显示S4S4S4S4S4......这个字符串,因此是s4的定时器发生作用;因此请注意,解决办法可以将settimer放在s4.show()之前,或者再调用一个s3的空方法也可以;