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出错了就查不出数据了?

解决方案 »

  1.   

    几小时后,才不刷新,有可能问题存在1.线程退出了.
    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;
      

  2.   

    想来看看,还是这个条件>>if LowerCase(Form1.ADODataSet1.FieldByName('sCom').AsString) = LowerCase(SLChK.Names[b]) then 也有可能这个条件为false;中的LowerCase(SLChK.Names[b] ;这个数组SLChK.Names,及变量b,应该检查一下这两个不在线程中的变量会不会有什么影响;它有可能,刚才开始运行时是正确的,运行几个小时后,就可能会在别的地方被修改了.以上只是我的一点看法,不定正确.