+ -
当前位置:首页 → 问答吧 → Timer中使用Application.ProcessMessages问题

Timer中使用Application.ProcessMessages问题

时间:2011-12-10

来源:互联网

为什么生成的程序,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;


作者: WinSockCF   发布时间: 2011-12-10

长时间占用主线程的应该考虑另外开线程而非定时器。

作者: pathletboy   发布时间: 2011-12-10

因为Application.ProcessMessages或接收到timer的消息,从而又执行到了Timer1Timer这个事件的代码,比如当你第一个timer事件触发,并显示5的时候,去ProcessMessages了一下,正好收到timer消息,于是又执行该事件的代码,又从0开始循环显示。。

作者: truexf   发布时间: 2011-12-10

因为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;

作者: kaikai_kk   发布时间: 2011-12-10

热门下载

更多