在主线程中用conn.connected无法判断数据库连接是否正常,只好使用定时器,程序如下:
procedure TSuperviseInfaceService.TimerTimer(Sender: TObject);
var
    sql:string;
begin
    Timer.Enabled :=False;
    try
        sql:='select count(*) from AcceptItem';
        TimerQuery.SQL.Text :=sql;
        timerQuery.Connection:=Conn;
        timerQuery.Open ;
        timerQuery.Close ;
        if sThreadTracData=nil then
        begin
           sThreadTracData:=ThreadTracData.Create(Conn,sURL);
           self.LogMessage('aaaaaaaaaaaaaaaaaaaaaaaaaa'); 
        end;
    except on e:exception do
    begin
        try
            if sThreadTracData<>nil then
                sThreadTracData.Terminate ;
            Conn.Close ;
            Conn.Connected :=True;
            if Conn.Connected then
                sThreadTracData:=ThreadTracData.Create(Conn,sURL);
        except on e:exception do
            self.LogMessage(e.Message );
        end;
        self.LogMessage(e.Message); 
    end;
    end;
    Timer.Enabled :=True;
end;
用定时器执行一个查询,如果查询能打开记录集,我认为连接是正确的,如果打不开,那么我关掉线程,关掉连接,然后重新连接,如果连接成功后再重新开线程。这个办法有时候能够重新执行线程,有时候却不能重新执行线程。请问这是为什么?

解决方案 »

  1.   

    >>在主线程中如何让多线程能够在数据库断掉的时候线程关闭
    用多一个辅助线程监视,有问题,就挂起 "数据库断掉的时候线程关闭",挂起应该就可
      

  2.   

    老大的意思是,数据库断掉时不用关闭线程,suspend就可以了,重新连接上后,resume唤醒线程
      

  3.   

    procedure TSuperviseInfaceService.TimerTimer(Sender: TObject);
    var
        sql:string;
    begin
        Timer.Enabled :=False;
        try
            sql:='select count(*) from AcceptItem';
            TimerQuery.SQL.Text :=sql;
            timerQuery.Connection:=Conn;
            timerQuery.Open ;
            timerQuery.Close ;
        except on e:exception do
        begin
            try
                if not sThreadTracData.Suspended then
                begin
                    sThreadTracData.Suspend ;
                    self.LogMessage('bbbb');
                end;
                Conn.Close ;
                Conn.Connected :=True;
                if Conn.Connected then
                begin
                   sThreadTracData.Resume ;
                   self.LogMessage('ccccc');
                end;
            except on e:exception do
                self.LogMessage('a' + e.Message );
            end;
            self.LogMessage('b' + e.Message); 
        end;
        end;
        Timer.Enabled :=True;
    end;
    采用挂起线程,重新连接后唤起线程的方法,这样就存在数据库重新连接后,线程并不是继续运行
      

  4.   

    其他线程中连接数据,如果已经断开了,就会出错啊,在except中将自己挂起(Suspended := true)
    然后在主线现成中尝试连接,如果连接上了,将挂起的线程唤醒