delphi中的timer组件interval是设置延时的
要是ontimer里的事件处理时间大于interval所设置延时,是否在执行ontimer里的事件时候,timer又会再次被激活?也就是没有执行完ontimer事件后又再次被激活而反复执行,要是这样,有什么方法能避免这种事件发生,不管ontimer里的事件执行需要多长时间,都把它执行完后才再次定时,请给出源码.
要是ontimer里的事件处理时间大于interval所设置延时,是否在执行ontimer里的事件时候,timer又会再次被激活?也就是没有执行完ontimer事件后又再次被激活而反复执行,要是这样,有什么方法能避免这种事件发生,不管ontimer里的事件执行需要多长时间,都把它执行完后才再次定时,请给出源码.
或者干脆在调用函数的时候将enable false了,调用完了之后在true过来(时间上不连续)
ONTIMER 事件每隔INTERVAL的时间 就执行一次!!!
像你的想法不会出现!!
ONTIMER 事件每隔INTERVAL的时间 就执行一次!!!
像你的想法不会出现!!
这才是真正的高手!!!!!!!!!!!11
是啊,我知道到是每隔interval所设定的时间就执行ONTIMER 事件,但是要是ONTIMER 事件执行的速度也就是耗费的时间大于interval所设定的时间,那程序是继续执行完还是直接又重新触发重头执行???
开始设置为true,执行开始后设置为false,执行完了再设置为true。
开始执行的时候都要先检查标志是否为true;
timer1.interval:=5000;
timer1.enabled:=true;
这样不行吗?
n.间隔;休息;间距
begin
timer.enable:= false;
//do something;
timer.enable:= true;
end;
在长的TIMER 里发生事件 !!
晕
我那个程序是毫秒级的越快越好,向你这么设置怎么用??
begin
if excute then exit;
excute:= true;
//do something;
excute:= false;
end;
我是菠菜,非高手!
我是菠菜,非高手!
在拿我开玩笑吗?*^_^*
begin
inc(i);
sleep(3000);
ListBox1.Items.Add(inttostr(i));
end;
begin
inc(i);
sleep(3000);
ListBox1.Items.Add(inttostr(i));
end;
但是如果调用了Application.ProcessMessages或MessageBox等,则可能会产生第二次OnTimer
begin
inc(i);
sleep(3000);
ListBox1.Items.Add(inttostr(i));
end;
我记得我以前作过一个定时扫描端口的程序,单独使用了一个线程来执行端口扫描,如果不做同步的话会跑出一堆错误来。
begin
inc(i);
sleep(3000);
ListBox1.Items.Add(inttostr(i)+':'+FormatDateTime('ss',now));
end;
你会发现,他们的时间间隔是3秒!不是4秒!
看来当前一个timer事件没完成时,后一个timer事件是处于等待状态的,用 小查 的 回复,Timer利用消息机制,那正好解释了这个现象
小弟还有个问题就是:
Timer里的interval设置是不是在不同配置的电脑里所延长的时间是一样的?
比如386和P4机器运行同一个程序,延长时间是一样吗?还有误差吗?
要是不一样有什么解决方法能解决,最好也给出代码,分不够我也会加.
Timer 的定时的确是不稳定的,
不同的机器会有点差别
先按我的理解给出答案。
这个问题你大可以设置两个TIMER。
代码如下
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled:=fasle;
//your code
timer2.Enabled:=true;
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
timer1.Enabled:=true;
timer2.Enabled:=fasle;
end;
//说明一下,这个程序是我进行轮询的时候用的,timer1的interval设置为300
timer2的interval设置为3000,在初始之前,设置timer1。Enabled:=ture;
timer2.Enabled:=false;
也就是说,TIMER1的ontime触发时,不会再进行轮询,直到处理完,间隔3秒后再进行轮询
最后要说明一下,itmer控件是响应windows的WM_Timer消息的,属于回叫函数。
不同于sleep()函数。
具体的消息循环之类的概念,你可以参考关于windows下的消息之类的参考资料。
如果要求1ms-5ms这么高的时间稳定性,那只能说,你用错了操作系统。
windows本身的消息机制限制了它是不可能达到的。
1 多媒体库(mmSystem?)中有一个函数(mmTimer?),可以试一试
2 用一个线程(必要时优先级设高点),结合 QueryPerformanceFrequency 和
QueryPerformanceCounter 确定时间间隔(不要用Sleep,它很不准),再执行相应操作
建立线程使用下面的两个方法之一定时1:
var FStop: THandle;FInterval := 100;
FStop := CreateEvent(nil, False, False, nil);
if WaitForSingleObject(FStop, FInterval) = WAIT_TIMEOUT then ......2:
GetTickCount