我创建了3个线程,但是在系统任务管理器中发现一共启动了16个线程,为什么?这种情况影响系统的稳定吗?如果不影响,为什么总是抱地址错误???各位:我很着急!!!谢谢大家

解决方案 »

  1.   

    window2000AdvacedServer,可以打开任务管理器,然后在选择中可以设置。选择要查看的自定义信息。:)
      

  2.   

    我的线程系统是从远端几个数据库时时抓取数据,只能用线程来做...对应一个数据库,创建一个trhead,并没有在进行创建呀。
      

  3.   

    回复人: r_ren(友) ( ) 信誉:100  2004-01-17 14:58:00  得分:0 
     
     
      window2000AdvacedServer,可以打开任务管理器,然后在选择中可以设置。选择要查看的自定义信息。:)
     
     ___________________学了一招!!
      

  4.   

    停止在启动,立刻就是16个...,是不是exe本身就会创建这么多???还是其他什么原因,如果说线程一直都在增长,或许说问题就很容易找到,但是运行10个小时以上,都一直是16个。WHY!!!!!!!!!
      

  5.   

    主程序只有一个线程,你有没有调动别的控制或DLL,可能这里面也有创建线程.
      

  6.   

    主程序只有一个线程,你有没有调动别的控件或DLL,可能这里面也有创建线程.(打错了^_^)
      

  7.   

    调用除了ADO组件以外的其它数据库组建如BDE,要不要用:
    CoInitialize(nil)CoUninitialize
    因为我用的是BDE,没有用ADO,BDE速度快。
    是不是这里出的问题?
      

  8.   

    CoInitialize 它是进入COM线程套间,ADO是COM,调用是需要它,
    BDE就不要写它了。好久没有用BDE了,BDE是自己作会话处理,我猜测那16个线程同BDE有关的。
      

  9.   

    在delphi里用Ctrl + Alt + T 看看
      

  10.   

    也许和BDE有关系,不过最好还是写些代码出来
      

  11.   

    unit ThrdClass;interfaceuses
      Classes,AdoDb,SysUtils,DB,DBTables,QDialogs;type  TExpDataThrd = class(TThread)       //导库基类
      private
        { Private declarations }     FServ,FSpe,FYWSerName:string;
         //FConn:TADOConnection;
         FDB:TDatabase;
         FDBName:string;
         FLocalDb:TDatabase;
         procedure  SetField;
      protected     LocalQry,adsFilter,adsSYS_FILTER,adsSheet,OutAds:TQuery;
         SourField,DesField:string;//源表sql,目的表sql
         {构建一条最终的获得源库中故障时时信息的sql语句}
        procedure  consql;virtual;abstract;
        {构建多条sql语句,插入ORIGFAULTJHJ表中}
        procedure combinsql;virtual;abstract;
        {对数据进行第一次的过滤,插入filterjhj表中}
        procedure  firstfilter;virtual;abstract;
        {第三次过滤}
        procedure  intosheet;virtual;abstract;
        
        procedure  Execute; override;
        //procedure  exportdata;//virtual;  //导库
        function  exportdata:boolean;
      public
        constructor Create(valServ, ValSpe,valYwSer: string;valDB,vaLocalDb:TDatabase);
        property   serv:string read  FServ write Fserv;   //存放数据库的odbc名
        property   Spe:string read  FSpe  write FSpe;     //专业
        property   YWSerName:string read  FYWSerName  write FYWSerName; //运维库的dbname
        property   DB:TDatabase read FDB write FDB;
        property   DBName:string read FDBName write FDBName;
        property   LocalDb:TDatabase read FLocalDb write FLocalDb;
      end;  TJHJThrd=class(TExpDataThrd)     //交换机类
      private
        now_date :string;
        endsql:string;//取得源数据的sql
        midtime:string;  protected
      {构建一条最终的获得源库中故障时时信息的sql语句}
        procedure  consql;override;
        {构建多条sql语句,插入ORIGFAULTJHJ表中}
        procedure combinsql;override;
        {对数据进行第一次的过滤,插入filterjhj表中}
        procedure  firstfilter;override;
        {第三次过滤}
        procedure  intosheet;override;  end;
      
      TPOWERThrd=class(TExpDataThrd)     //交换机类
      private
        now_date :string;
        endsql:string;//取得源数据的sql
        midtime:string;
        midnum:string; //临时序号
      protected
      {构建一条最终的获得源库中故障时时信息的sql语句}
        procedure  consql;override;
        {构建多条sql语句,插入ORIGFAULTJHJ表中}
        procedure combinsql;override;
        {对数据进行第一次的过滤,插入filterjhj表中}
        procedure  firstfilter;override;
        {第三次过滤}
        procedure  intosheet;override;  end;
      
    implementationuses uf_pub,ini_class;{ Important: Methods and properties of objects in VCL or CLX can only be used
      in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure TExpDataThrd.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{ TExpDataThrd }procedure TExpDataThrd.SetField;
    var
       //tmpAds:TADODataSet;
       tmpAds:TQuery;
       tmpsour,tmpdes,tmpsql:string;
       stable,dtable:string;//源表名,目的表名
    begin
          //取得对应关系表中的原表,新表的字段
       tmpsql:='SELECT * FROM T_DYGX WHERE BDEBM='''+FServ+''' ';
       //showmessage(FLocalDb.DatabaseName);
       tmpAds:=TQuery.Create(nil);
       try
          rsOpen(FLocalDb.DatabaseName,tmpAds,tmpsql);
       except on e:exception do
          begin
              adderrorlog('ThrdClass',tmpsql,pchar(e.message));   
              ReRsopen(FLocalDb,tmpAds,'ywbsconn',tmpsql);
          end;
       end;   if tmpAds.RecordCount>0 then
       begin
          stable:=tmpAds.fieldbyname('ykbm').AsString;
          dtable:=tmpAds.fieldbyname('mdkbm').AsString;
          tmpAds.First;
          tmpsql:='';
          tmpsour:='';
          tmpdes:='';
          while not tmpAds.Eof do
          begin
             //原表中取出的字段
             tmpsour:=tmpsour+tmpAds.fieldbyname('YZDM').AsString+',';
             //目的表的插入的字段
             tmpdes:=tmpdes+tmpAds.fieldbyname('MZDM').AsString+',';
             tmpAds.Next;
          end;
          tmpsour:=copy(tmpsour,0,length(tmpsour)-1);
          tmpdes:=copy(tmpdes,0,length(tmpdes)-1);
          //取得源表中的数据sql
                                
          if FSpe='LB01' then
          begin
             
             SourField:='SELECT '+QuotedStr(FSpe)+' as WHLB,'+QuotedStr(FServ)+' as DYXT,'+tmpsour+' FROM '+stable;
             DesField:=' insert into '+dtable+' (XH,WHLB,DYXT,'+tmpdes+') ';      end
          else  if FSpe='LB03' then
          begin         SourField:='SELECT '+tmpsour+' FROM '+stable;
             DesField:=' insert into '+dtable+' (XH,'+tmpdes+') ';
          end;
       end
       else
       begin
          msgbox('提示!','请检查对应关系表中是否添加了对应的字段信息!',tWarning);
          exit;
       end;   if Assigned(tmpAds) then
          FreeAndNil(tmpAds);
    end;
    constructor TExpDataThrd.Create(valServ, ValSpe,valYwSer: string;valDB,vaLocalDb:TDatabase);
    begin
       FServ:=valServ;
       FSpe:=ValSpe;
       FYWSerName:=valYwSer;
       FDB:=valDB;
       FDBName:=valDB.DatabaseName;
       FLocalDb:=vaLocalDb;
       if Assigned(LocalQry) then
          FreeAndNil(LocalQry);
       LocalQry:=TQuery.Create(nil);       //combinsql 本地库用
       LocalQry.Close;
       LocalQry.DatabaseName:=vaLocalDb.DatabaseName;   if Assigned(OutAds) then
          FreeAndNil(OutAds);
       OutAds:=TQuery.Create(nil);
       OutAds.DatabaseName:=FDB.DatabaseName;   //网管库用   if Assigned(adsFilter) then
          FreeAndNil(adsFilter);
       adsFilter:=TQuery.Create(nil);   // 本地库用
       adsFilter.DatabaseName:=vaLocalDb.DatabaseName;   if Assigned(adsSYS_FILTER) then
          FreeAndNil(adsSYS_FILTER);
       adsSYS_FILTER:=TQuery.Create(nil);  // 本地库用
       adsSYS_FILTER.DatabaseName:=vaLocalDb.DatabaseName;   if Assigned(adsSheet) then
          FreeAndNil(adsSheet);
       adsSheet:=TQuery.Create(nil);   // 本地库用
       adsSheet.DatabaseName:=vaLocalDb.DatabaseName;   SetField;  
       FreeOnTerminate := True;   inherited Create(false);
    end;
    function  TExpDataThrd.exportdata:boolean;
    begin
       result:=false;
       try
          {Synchronize(consql);
          Synchronize(combinsql);
          Synchronize(firstfilter);
          Synchronize(intosheet); }
          consql;
          combinsql;
          firstfilter;
          intosheet;
          result:=true;
       except on e:exception do
          begin
             adderrorlog('ThrdClass',FSpe+'失败',pchar(e.message));
             result:=false;
          end
       end;end;procedure TExpDataThrd.Execute;
    var
       tmpbln:boolean;
    begin
      { Place thread code here }
      // while true do
       while not Terminated do
       begin
          tmpbln:=exportdata;
          if   not tmpbln then
          begin
             sleep(6000);
          end;
       end;
    end;
      

  12.   

    {***************************************************
     函数说明:构建一条最终的获得源库中故障时时信息的sql语句
     参数说明:****************************************************}
    procedure TJHJThrd.consql;
    var
       xsql:string;
       endtime:string;
    begin   gNowTimeJHJ:=now;
       endtime:=readinifile('TIMETXT.INI','nowtime');   midtime:=stepdatetime(endtime,timestep);
       if StrToDateTime(midtime)>now then
       begin
          timestep:=30;
          midtime:=FormatDateTime('yyyy-mm-dd hh:nn:ss',now);
       end;   while ((endtime='ERROR') or (length(endtime)<9)) do
       begin
          endtime:='';
          endsql:='';
          xsql:='select convert(varchar(8),getdate(),112)+'' ''+convert(varchar(8),getdate(),108)';
          try
            OutAds.Close;
            rsOpenThrd(DBName,OutAds,xsql);
          except on e:exception do
             begin
                 OutAds.Close;
                 adderrorlog('ThrdClass',xsql,pchar(e.message));
                 ReRsopen(DB,OutAds,'jhjconn',xsql);
             end;
          end;      writeinifile('TIMETXT.INI','nowtime',OutAds.Fields[0].AsString);
          endtime:=readinifile('TIMETXT.INI','nowtime');
       end;
       
       endsql:=SourField+'  WHERE  occur_time>'''+endtime+''' and occur_time<='''+midtime+''' '+
                   ' order by occur_time asc';
       gNowTimeJHJ:=now;end;{***************************************************
     函数说明:构建多条sql语句,插入ORIGFAULTJHJ表中
     参数说明:
    ***************************************************}
    procedure TJHJThrd.combinsql;
    var
       xsql:string;
       j,step,step1:integer;
       ddatestr:string;//starttime,系统启动时间,endtime记录一次取数据的终止时间   teststr:string;
       tempxh:integer;
    begin   gNowTimeJHJ:=now;
       //删除故障表1中的旧的数据
       xsql:='delete from ORIGFAULTJHJ';
       try
          LocalQry.Close;
          ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);      except on e:exception do
             begin
                LocalQry.Close;
                adderrorlog('ThrdClass',xsql,pchar(e.message));
                ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
             end;
       end;   //取的源表的数据集
       LocalQry.SQL.Clear;
       try
           OutAds.Close;
           rsOpenThrd(DBName,OutAds,endsql);      except on e:exception do
          begin
             OutAds.Close;
             adderrorlog('ThrdClass',endsql,pchar(e.message));
             ReRsopen(DB,OutAds,'jhjconn',endsql);
          end;
       end;   gNowTimeJHJ:=now;
          step:=0;
          step1:=1;
          OutAds.First;
          //生成自动的序号
          tempxh:=NewXH(FLocalDb.DatabaseName,'ORIGFAULTJHJ','XH');
          while not OutAds.Eof  do
          begin
             while ((step1<>0) and (not OutAds.Eof))  do
             begin
                //取得目的库的字段名
                ddatestr:='';
                for j:=0 to OutAds.FieldCount-1 do
                begin
                   if OutAds.Fields[j].IsNull then
                   begin
                      ddatestr:=ddatestr+'null' +',';
                   end
                   else
                   begin
                      teststr:=stringreplace(OutAds.Fields[j].AsString,'''','◎',[rfReplaceAll]);
                      ddatestr:=ddatestr+''''+teststr+'''' +',';
                   end;
                end;
                ddatestr:=copy(ddatestr,0,length(ddatestr)-1);
                //拼总的sql语句
                xsql:=DesField+'  VALUES ('+IntToStr(tempxh)+','+ddatestr+') ';
                LocalQry.SQL.Add(xsql);
                step:=step+1;
                step1:= step mod 50;
                OutAds.Next;
                tempxh:=tempxh+1;
             end;         try
                LocalQry.Close;
                ExecSql(FLocalDb.DatabaseName,LocalQry,LocalQry.SQL.Text);
             except on e:exception do
                begin
                   LocalQry.Close;
                   adderrorlog('ThrdClass',LocalQry.SQL.Text,pchar(e.message));
                   ReExecSql('ywbsconn',FLocalDb,LocalQry,LocalQry.SQL.Text);
                end;
             end;
             LocalQry.SQL.Clear;
             step1:=1;      end;
          OutAds.Close;
          LocalQry.Close;
          if timestep>10 then
          begin
             if step>100 then timestep:=timestep-10
             else
             if step<95 then timestep:=timestep+15;
          end;
          writeinifile('TIMETXT.INI','nowtime',midtime);
          gNowTimeJHJ:=now;end;
      

  13.   

    {第一次过滤,插入filterjhj表中}
    procedure TJHJThrd.firstfilter;
    var
       xsql:string;
       tempXH:string;
    begin
       //KillLock(gDb.DatabaseName,LocalQry,adsFilter);//杀锁
       gNowTimeJHJ:=now;
       //1:翻译,补足原始故障信息当中的设备名称,设备类型
       xsql:=' update ORIGFAULTJHJ '+
             ' set ORIGFAULTJHJ.SBMC=DATA_SWITCH.SW_CH_NAME, '+
             ' ORIGFAULTJHJ.SBLX=DATA_SWITCH.SWITCH_KIND '+
             ' FROM ORIGFAULTJHJ,DATA_SWITCH '+
             ' where '+
             ' ORIGFAULTJHJ.BYC1 IS NULL '+
             ' AND  ORIGFAULTJHJ.SBBH=DATA_SWITCH.SWITCH_ID';
       try
          LocalQry.Close;
          ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);
          except on e:exception do
             begin
                LocalQry.Close;
                adderrorlog('ThrdClass',xsql,pchar(e.message));
                ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
             end;
       end;
       //2:删除FILTERJHJ表中的数据以便当次使用
       xsql:='DELETE FROM FILTERJHJ ';
       try
          LocalQry.Close;
          ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);
          except on e:exception do
             begin
                LocalQry.Close;
                adderrorlog('ThrdClass',xsql,pchar(e.message));
                ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
             end;
       end;
       //3:取得最小的记录集数据的序号
       xsql:=' select MIN(JHJ.XH) XH,JHJ.SBBH,JHJ.GJZ,JHJ.GZLX,JHJ.JYCD,JHJ.GZDW '+
             ' from ORIGFAULTJHJ JHJ '+
             ' group by JHJ.SBBH,JHJ.GJZ, JHJ.GZLX,JHJ.JYCD,JHJ.GZDW '+
             ' order by XH ';
       try
          adsSYS_FILTER.Close;
          rsOpenThrd(FLocalDb.DatabaseName,adsSYS_FILTER,xsql);
          except on e:exception do
          begin
             adsSYS_FILTER.Close;
             adderrorlog('ThrdClass',xsql,pchar(e.message));
             ReRsopen(FLocalDb,adsSYS_FILTER,'ywbsconn',xsql);
          end;
       end;   adsSYS_FILTER.First;
       while not adsSYS_FILTER.Eof do
       begin
          tempXH:=adsSYS_FILTER.fieldbyname('XH').AsString;
          xsql:=' SELECT '''+serv+''','''+Spe+''',JHJ.XH,JHJ.GZBM,JHJ.JYCD,JHJ.GZMS,JHJ.GJZ,JHJ.GZDW,JHJ.SJ,JHJ.SBBH,JHJ.GZLX,JHJ.SBLX,JHJ.SBMC '+
                ' from ORIGFAULTJHJ JHJ,THESAURUS,DATA_SWITCH SWITCH '+
                ' WHERE  JHJ.GJZ=THESAURUS.ORG_CLASS'+
                ' and JHJ.GZLX=THESAURUS.ALARMTYPE'+
                ' and JHJ.JYCD=THESAURUS.ALARMLVL'+
                ' and JHJ.XH='+tempXH+
                ' and SWITCH.SWITCH_KIND=THESAURUS.DEVICEID'+
                ' and JHJ.SBBH=SWITCH.SWITCH_ID';
         try
            adsFilter.Close;
            rsOpenThrd(FLocalDb.DatabaseName,adsFilter,xsql);
            except on e:exception do
            begin
               adsFilter.Close;
               adderrorlog('ThrdClass',xsql,pchar(e.message));
               ReRsopen(FLocalDb,adsFilter,'ywbsconn',xsql);
            end;
         end;
         xsql:='';
         if adsFilter.IsEmpty then
         begin
            xsql:='INSERT INTO FILTERJHJ(DYXT,WHLB,XH,GZBM,JYCD,GZMS,GJZ,GZDW,SJ,SBBH,GZLX,SBLX,SBMC)'+
                  ' SELECT '''+serv+''','''+Spe+''',JHJ.XH,JHJ.GZBM,JHJ.JYCD,JHJ.GZMS,JHJ.GJZ,JHJ.GZDW,JHJ.SJ,JHJ.SBBH,JHJ.GZLX,JHJ.SBLX,JHJ.SBMC '+
                ' from ORIGFAULTJHJ JHJ WHERE JHJ.XH='+tempXH;
         end
         else
         begin
          //4:插入到FILTERJHJ表中以供T_SBGZXX表使用
             xsql:='INSERT INTO FILTERJHJ(DYXT,WHLB,XH,GZBM,JYCD,GZMS,GJZ,GZDW,SJ,SBBH,GZLX,SBLX,SBMC)'+
                ' SELECT '''+serv+''','''+Spe+''',JHJ.XH,JHJ.GZBM,JHJ.JYCD,JHJ.GZMS,JHJ.GJZ,JHJ.GZDW,JHJ.SJ,JHJ.SBBH,JHJ.GZLX,JHJ.SBLX,JHJ.SBMC '+
                ' from ORIGFAULTJHJ JHJ,THESAURUS,DATA_SWITCH SWITCH '+
                ' WHERE '+
                ' THESAURUS.ISFILTER=''是'' '+
                ' and JHJ.GJZ=THESAURUS.ORG_CLASS'+
                ' and JHJ.GZLX=THESAURUS.ALARMTYPE'+
                ' and JHJ.JYCD=THESAURUS.ALARMLVL'+
                ' and JHJ.XH='+tempXH+
                ' and SWITCH.SWITCH_KIND=THESAURUS.DEVICEID'+
                ' and JHJ.SBBH=SWITCH.SWITCH_ID';
          end;
          try
             LocalQry.Close;
             ExecSql(FLocalDb.DatabaseName,LocalQry,xsql);
          except on e:exception do
             begin
                LocalQry.Close;
                adderrorlog('ThrdClass',xsql,pchar(e.message));
                ReExecSql('ywbsconn',FLocalDb,LocalQry,xsql);
             end;
          end;
          adsSYS_FILTER.Next;    
       end;   gNowTimeJHJ:=now;end;