运行一段时间后不定期出现 list index out of bounds (?) 问题(100分)

Z

zhj218

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DB, DBTables, StdCtrls, Buttons, ComCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
Query1: TQuery;
Database1: TDatabase;
Table1: TTable;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
int_index:integer;
Session:array[0..5] of Tsession;
query:array[0..5] of Tquery;
datasource:array[0..5] of Tdatasource;
public
{ Public declarations }
eofarray:array[0..5] of integer;
end;
TqueryThread=Class(TThread)
Private
{ Private declarations }
FSession:Tsession;
Fquery:Tquery;
Fdatasource:Tdatasource;
FQueryException:Exception;
Fid:integer;
procedure connectDataSource;
Procedure ShowQueryError;
Procedure destroy(index:integer);
protected
procedure execute;override;
public
int_user:integer;
constructor Create(Session:TSession;Query:Tquery;Datasource:Tdatasource;index:integer;id:integer);
virtual;
end;

var
Form1: TForm1;
implementation
constructor TqueryThread.Create(Session:TSession;Query:Tquery;Datasource:Tdatasource;index:integer;id:integer);
begin
inherited Create(True);
Fquery:=query;
fdatasource:=datasource;
int_user:=index;
Fid:=id;
fquery.SessionName:=session.SessionName;
fdatasource.DataSet:=fquery;
FreeonTerminate:=true;
resume;
end;

procedure TqueryThread.Execute;
begin
try
synchronize(connectDataSource);
destroy(int_user);
sleep(100);
except
FQueryexception:=Exceptobject as Exception;
Synchronize(ShowQueryError);
end;
end;

procedure TqueryThread.destroy(index:integer);
begin
form1.eofarray[index]:=8;
if Assigned(fdatasource) then
begin
fdatasource.Free;
fdatasource:=nil;
end;
if Assigned(fquery) then
begin
fquery.Free;
fquery:=nil;
end;
if Assigned(fsession) then
begin
fsession.Free;
fsession:=nil;
end;
end;

procedure TqueryThread.connectdataSource;
begin
Fdatasource.dataset:=Fquery;
end;

procedure TqueryThread.showqueryerror;
begin
application.showexception(Fqueryexception);
end;

Procedure runquery(Session:Tsession;Query:Tquery;Datasource:Tdatasource;index:integer;id:integer);
var
Thread:TqueryThread;
begin
Thread:=TqueryThread.Create(Session,Query,Datasource,index,id);
end;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
eofarray[0]:=8;
eofarray[1]:=8;
eofarray[2]:=8;
eofarray[3]:=8;
eofarray[4]:=8;
eofarray[5]:=8;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
msgid:integer;
begin
timer1.Enabled:=false;
with query1do
begin
close;
sql.Clear;
sql.Add('select * from recervemsg');
open;
end;
int_index:=0;
while not query1.Eofdo
begin
for i:=0 to 5do
begin
if eofarray=8 then
begin
int_index:=i;
break;
end;
sleep(10);
end;
eofarray[int_index]:=int_index;
query[int_index]:=Tquery.Create(self);
query[int_index].DatabaseName:='front';
session[int_index]:=Tsession.Create(self);
datasource[int_index]:=Tdatasource.Create(self);
msgid:=query1.fieldbyname('dataid').asinteger;
runquery(Session[int_index],Query[int_index],Datasource[int_index],int_index,msgid);
query1.next;
end;
timer1.Enabled:=true;
end;
end.

运行一段时间后不定期出现 list index out of bounds (?(不确定的数字)) 问题,不知什么原因,各位帮我查查,谢谢
 
看看在运行时有没有超出数组范围的可能。
 
这是下标越界问题
 
肯定是你的程序问题,好好检查一下,数组越界。
 
数组没有越界,我把数组长组调成150还是没用
 
跟踪一下,肯定是数组越界,
 
跟踪调试一下就行了。
 
有时timer执行一万多次的时候才出现问题,那位能帮我分析一下代码吗,我不知道问题出现在那里
 
请问哪里越界了
 
destroy(int_user);
//////// 肯定超过了 5 ,改成
if (int_user>5) or int_user<0 then
exit;
destroy(int_user);
 
还是不行
 
在你的每个过程里捕获错误,当捕获到错误后,显示一个过程名,这样就知道错误在哪个过程
里了。缩小范围。
 
数组超过界限!
用跟踪的方法很容易找的!
 
问题出在这里:
eofarray[int_index]:=int_index;
query[int_index]:=Tquery.Create(self);
query[int_index].DatabaseName:='front';
session[int_index]:=Tsession.Create(self);
datasource[int_index]:=Tdatasource.Create(self
但是数据库没有越限,我不知道什么地方错了
是不是在线程释放的时候没有释放干净
 
把 session 的变量名换一下,系统有默认的 session 变量
MySession:array[0..5] of Tsession;
 
现在知道问题是出在session上面:
session[int_index]:=Tsession.Create(self);
在改了变量名后还会出现老问题。
循环执行几百次不会出现问题,但是一执行多了以后就会出现问题,不知是什么缘故?
 
出错的时候把你的int_index打印出来看看。
 
最好在while not query1.Eofdo
前加上query1.Frist ,
还有很有可能数组过小(0。。5),换大一点,或者另想它法!
如果表内数据过多会*&amp;*(%%^**&amp;
 
接受答案了.
 
顶部