Timer中使用Application.ProcessMessages问题
为什么生成的程序,Edit中的数值会一直不停的变化,而不是向循环中所示从0到100000,显示数字完后继续执行
Timer1.Enabled:=False;的代码?如果不加Application.ProcessMessages;的话就没问题,但是Edit无法实时更新数值.
- Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);begin Timer1.Enabled :=True;end;procedure TForm1.Timer1Timer(Sender: TObject);var i:Integer;begin for I := 0 to 100000 do begin Edit1.Text :=IntToStr(i); Application.ProcessMessages; end; Timer1.Enabled :=False;end;
[解决办法]
长时间占用主线程的应该考虑另外开线程而非定时器。
[解决办法]
因为Application.ProcessMessages或接收到timer的消息,从而又执行到了Timer1Timer这个事件的代码,比如当你第一个timer事件触发,并显示5的时候,去ProcessMessages了一下,正好收到timer消息,于是又执行该事件的代码,又从0开始循环显示。。
[解决办法]
因为Timer在系统进程中优先级是最低的了,加了ProcessMessages;有其它事件的话会优先执行
可能是Interval太小了,循环可能要3秒才计算完,但Interval是1秒
所以循环还没有结束,第2次Timer已经开始了,就这样不停的执行下去咯
用一个全局变量就看和出来了,把Interval设置1000,2000,3000,4000...试试
var
j:integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
j:=0 ;
Timer1.Enabled :=True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:Integer;
begin
inc(j);
edit2.Text:=inttostr(j);
for I := 0 to 100000 do begin
Edit1.Text :=IntToStr(i);
Application.ProcessMessages;
end;
Timer1.Enabled :=False;
end;
[解决办法]
记住,timer不是线程,他一样会阻塞主线程的
[解决办法]
将消耗时间长的代码扔到线程里执行。
那样不会使主线程得到干扰
[解决办法]
- Delphi(Pascal) code
procedure TForm1.Timer1Timer(Sender: TObject);var i:Integer;begin Timer1.Enabled :=False; //移动到这里试一下 for I := 0 to 100000 do begin Edit1.Text :=IntToStr(i); Application.ProcessMessages; end;end;
[解决办法]
简单一句,Timer事件中不能有application.ProcessMessages
[解决办法]
消息重入了