procedure TForm1.dotest;
begin
  sleep(250);application.ProcessMessages;
end;//timer1.interval:=100;
procedure TForm1.Timer1Timer(Sender: TObject);
begin  
  dotest;
end;问题简化后大概就是以上的代码,ontime事件运行时间长了,就会出现堆栈溢出的问题!
请高手指正 :(

解决方案 »

  1.   

    时间长是个什么概念?
    Cardinal类型范围是0到4294967295,程序本身不应该有错误的!
      

  2.   

    我测试了一下,运行到上千次就报错了。
    当时我还开了同样的两个定时器,一共是3个
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls,inifiles;type
      TForm1 = class(TForm)
        Button1: TButton;
        Timer1: TTimer;
        Edit1: TEdit;
        Timer2: TTimer;
        Timer3: TTimer;
        Button2: TButton;
        Button3: TButton;
        Edit2: TEdit;
        Edit3: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
        procedure Timer3Timer(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure test;
        procedure dotest;
      end;var
      Form1: TForm1;
      count1,count2,count3:integer;implementation{$R *.DFM}procedure TForm1.dotest;
    begin
      sleep(250);application.ProcessMessages;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      count1:=1;
      count2:=1;
      count3:=1;
    end;procedure TForm1.test;
    var str:Tstringlist;
    begin
       str:=Tstringlist.Create;
       try
         dotest;
       finally
         str.Free;
       end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      timer1.Enabled:=true;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      inc(count1);
      edit1.Text:=inttostr(count1);
      dotest;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      timer2.Enabled:=true;
    end;procedure TForm1.Timer2Timer(Sender: TObject);
    begin
      inc(count2);
      edit2.Text:=inttostr(count2);
      dotest;
    end;procedure TForm1.Timer3Timer(Sender: TObject);
    begin
      inc(count3);
      edit3.Text:=inttostr(count3);
      dotest;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      timer3.Enabled:=true;
    end;end.大家可以运行着试试
      

  3.   

    可能是同步的问题。你在DoTest中加入TCriticalSection同步一下看看。
      

  4.   

    改如下:
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled:=false;//禁止Timer1
      inc(count1);
      edit1.Text:=inttostr(count1);
      dotest;
      Timer1.Enabled:=true;//然后在恢复
    end;
    其他Timer一样。试试另外你的Test好象没有用吧:)
      

  5.   

    不错,就是因为在Timer里边没有关闭Timer造成的溢出,关闭Timer一下再打开就没有事了。
      

  6.   

    去掉application.procemessage就可以了