procedure CheckComputer.Chk;
var
str:String;
i:Integer;
Begin
for i:=0........略过 str:='Select sCom,sCardid,dtTime from tStat Where sCardid <> ''''';
Form1.ADODataSet1.CommandText:=str;
Form1.ADODataSet1.Open;
For
Form1.ADODataSet1.First;
while not Form1.ADODataSet1.Eof do
begin
if LowerCase(Form1.ADODataSet1.FieldByName('sCom').AsString) = LowerCase(SLChK.Names[b]) then
begin
Form1.SG1.Cells[1,b+1]:='计费中';
Form1.SG1.Cells[3,b+1]:=Form1.ADODataSet1.FieldByName('sCardid').AsString;
Form1.SG1.Cells[5,b+1]:=Form1.ADODataSet1.FieldByName('dtTime').AsWideString;
Break;
end;
Form1.ADODataSet1.Next;
end;
end;
Form1.ADODataSet1.Close;
end;
procedure CheckComputer.Execute;
begin
while not Terminated do
begin
Sleep(12000);
Synchronize(Chk);
end;
end;在一个线程中使用上面这段代码,但过了几小时后,这StringGrid就不刷新了,是什么问题呢?会不会是ADOConnection出错了就查不出数据了?
var
str:String;
i:Integer;
Begin
for i:=0........略过 str:='Select sCom,sCardid,dtTime from tStat Where sCardid <> ''''';
Form1.ADODataSet1.CommandText:=str;
Form1.ADODataSet1.Open;
For
Form1.ADODataSet1.First;
while not Form1.ADODataSet1.Eof do
begin
if LowerCase(Form1.ADODataSet1.FieldByName('sCom').AsString) = LowerCase(SLChK.Names[b]) then
begin
Form1.SG1.Cells[1,b+1]:='计费中';
Form1.SG1.Cells[3,b+1]:=Form1.ADODataSet1.FieldByName('sCardid').AsString;
Form1.SG1.Cells[5,b+1]:=Form1.ADODataSet1.FieldByName('dtTime').AsWideString;
Break;
end;
Form1.ADODataSet1.Next;
end;
end;
Form1.ADODataSet1.Close;
end;
procedure CheckComputer.Execute;
begin
while not Terminated do
begin
Sleep(12000);
Synchronize(Chk);
end;
end;在一个线程中使用上面这段代码,但过了几小时后,这StringGrid就不刷新了,是什么问题呢?会不会是ADOConnection出错了就查不出数据了?
2.线程没有退出,但Synchronize(Chk);没有正解执行;比如
>>while not Form1.ADODataSet1.Eof do 这个条件为false
>>if LowerCase(Form1.ADODataSet1.FieldByName('sCom').AsString) = LowerCase(SLChK.Names[b]) then 也有可能这个条件为false;上述这两种可能,是从你的代码中看出来的,但这种情况是运行了几个小时之后才出现的,所以应该可能性不大,还是应该从别的地方考虑;给你一个建议,改写一下Chk函数,加入一些异常处理,看能不能发现什么问题
procedure CheckComputer.Chk;
var
str:String;
i:Integer;
Begintryfor i:=0........略过str:='Select sCom,sCardid,dtTime from tStat Where sCardid <> ''''';
Form1.ADODataSet1.CommandText:=str;
Form1.ADODataSet1.Open;for i:=1 to Form1.ADODataSet1.RecordCount do
begin
if LowerCase(Form1.ADODataSet1.FieldByName('sCom').AsString) = LowerCase(SLChK.Names[b]) then
begin
Form1.SG1.Cells[1,b+1]:='计费中';
Form1.SG1.Cells[3,b+1]:=Form1.ADODataSet1.FieldByName('sCardid').AsString;
Form1.SG1.Cells[5,b+1]:=Form1.ADODataSet1.FieldByName('dtTime').AsWideString;
Break;
end;
Form1.ADODataSet1.Next;
end;Form1.ADODataSet1.Close;except
on E: Exception do ShowMessage(E.Message);//显示错误的异常,也可以将异常写入一个文本中,方便再查
end;
end;