单线程程序中如有俩个定时器,那么他们之间会不会交叉影响?(20分)

  • 主题发起人 主题发起人 lethe2002
  • 开始时间 开始时间
L

lethe2002

Unregistered / Unconfirmed
GUEST, unregistred user!
不会,单线程程序都是串行运行的,所以不会影响,如果同时到触发时间的话也是上个定时器执行完毕以后才执行下一个定时器函数
 
也就是说前一触发器还在执行阶段时,另一触发器触发,它也只能排在前一触发器执行完毕时才执行,这样好像不能够精确定时了?
 
你是单线程程序,如果按你的上面说的那就是多线程了。
 
哪可不一定!如下面的代码:结果是Edit1从1到30000没有问题,但Edit2没有一次从1到30000的.都是Application.ProcessMessages的原因.Timer1,Timer2的时间设为5秒!(我试了一下,就算是一个新的程序,什么都没有动过,运行起来也有2个线程,不知为什么?)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
begin
for i:=1 to 30000do
begin
Application.ProcessMessages;
edit1.Text:=inttostr(i);
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
i:integer;
begin
for i:=1 to 30000do
begin
Application.ProcessMessages;
edit2.Text:=inttostr(i);
end;
end;

end.
 
楼上是不是看错了,我刚才测试过,只有一个线程了。。。
 
我试过,好像受影响,一个正在执行的时候,别一个如果到了时间也会执得,
 
用timer不如用 多线程+sleep
如果timer中要处理的东西多,而且timer多于一个,
在win2000这样的机器没问题,在win98就可以导致
timer没有反应了。
 
如定时器1正在执行中,而定时器2触发,消息进入消息队列,当定时器2再次触发时,假设定时器1还在执行中,那该次触发消息是否会覆盖前一次触发消息,还是依次排队?如果是排队的话,应怎样消去前一次消息?
 
yanyandt2说的不错:
如果timer中要处理的东西多,而且timer多于一个,
在win2000这样的机器没问题,在win98就可以导致
timer没有反应了.我就遇到过,非得在时间短的timer的执行历程中计数若干次后加Application.ProcessMessages;才行
 
加了 Application.ProcessMessages还是单线程,也是串行进行的,只是消息重入而已。
 
To lethe2002:
消息是依次排队的,不会覆盖前一个Timer消息,可作以下试验:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
begin
Memo1.Lines.add('Timer1 begin
:'+inttostr(GetTickCount));
for i:=1 to 30000do
begin
Application.ProcessMessages;
edit1.Text:=inttostr(i);
end;
Memo1.Lines.add('Timer1 end :'+inttostr(GetTickCount));
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
i:integer;
begin
Memo1.Lines.add('Timer2 begin
:'+inttostr(GetTickCount));
for i:=1 to 30000do
begin
Application.ProcessMessages;
edit2.Text:=inttostr(i);
end;
Memo1.lines.Add('Timer2 end :'+inttostr(GetTickCount));
end;
从记录结果可知,每一次Timer事件都会执行完,但是Application.ProcessMessage会打乱程序的正常执行顺序,如同GoTo语句造成了流程混乱,当去掉Application.ProcessMessage时就不会出现这种情况,因此,当有两个以上的Timer时,不要在Timer中加Application.ProcessMessage,此时可用线程来代替Timer,如yanyandt2所说。
 
多人接受答案了。
 
后退
顶部