stackoverflow问题

whzxk 2003-11-26 05:56:36
procedure TForm1.dotest;
begin
sleep(250);application.ProcessMessages;
end;

//timer1.interval:=100;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
dotest;
end;

问题简化后大概就是以上的代码,ontime事件运行时间长了,就会出现堆栈溢出的问题!
请高手指正 :(
...全文
69 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
whzxk 2003-12-02
  • 打赏
  • 举报
回复
去掉application.procemessage就可以了
whzxk 2003-11-27
  • 打赏
  • 举报
回复
眼看问题就要解决了,我正在测试,结果出来后跟大家分享:)
sundayboysII 2003-11-27
  • 打赏
  • 举报
回复
不错,就是因为在Timer里边没有关闭Timer造成的溢出,关闭Timer一下再打开就没有事了。
rockswj 2003-11-27
  • 打赏
  • 举报
回复
改如下:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;//禁止Timer1
inc(count1);
edit1.Text:=inttostr(count1);
dotest;
Timer1.Enabled:=true;//然后在恢复
end;
其他Timer一样。试试另外你的Test好象没有用吧:)
jhwh 2003-11-27
  • 打赏
  • 举报
回复
可能是同步的问题。你在DoTest中加入TCriticalSection同步一下看看。
whzxk 2003-11-27
  • 打赏
  • 举报
回复
我是想改写程序,有什么好点子,完成同样的功能
liyangyao970 2003-11-26
  • 打赏
  • 举报
回复
是堆栈溢出吗?
改写程序吧
ekin 2003-11-26
  • 打赏
  • 举报
回复
up
whzxk 2003-11-26
  • 打赏
  • 举报
回复
我测试了一下,运行到上千次就报错了。
当时我还开了同样的两个定时器,一共是3个
unit Unit1;

interface

uses
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.

大家可以运行着试试
47522341 2003-11-26
  • 打赏
  • 举报
回复
up
xiaoqiang123 2003-11-26
  • 打赏
  • 举报
回复
能说清楚点吗?
FrameSniper 2003-11-26
  • 打赏
  • 举报
回复
时间长是个什么概念?
Cardinal类型范围是0到4294967295,程序本身不应该有错误的!

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧