问题如上,现在用一个CreateThread来建立一个线程,做一个查询数据库操作并将结果发送到远程的webservives。线程是放在一个timer控件里面定时触发建立的,
     
     现在有个问题,我实在看不出我线程函数里面有那个资源没有用完释放的,但在线程第一次触发运行后,第二行又触发建立线程。程序就会出错,直接挂掉,这个程序是后台运行。要一天24小时运行。这样肯定不行。
     线程里应该是有什么东西没清完。因为如果线程在连接数据库这一段代码出错(加了保护的),就会直接跳过后面的查询数据库并上传webservices数据这部分,直接到最后的释放资源部分,然后线程函数结束,这样的话,线程会一直运行,不会出错,这样看来,问题应该在查询数据库和上传webservices部分,可我实在没办法看出来是那里有问题,下面为代码,各位帮我看看。分太少了,没法。菜鸟啊。下面是线程函数单元。我把这个线程函数直接放在一个单元里,方便操作。unit HYLoad7ThreadFun;interfaceuses Windows,SysUtils,IniFiles,ADODB,XSBuiltIns,InvokeRegistry,Rio, SOAPHTTPClient,
     ActiveX;type
  TPstring = ^String;
  //线程主过程
  procedure UpDataFun(Connectstr: TPstring);stdcall;var ThreadFettle : Boolean;implementation
uses CommonFunctionUnit,hjwebservice,MainForm;const WebServiceSoap_location='http://10.194.35.58/fspaapp/hjwebservice.asmx';
      //sss='Provider=MSDAORA.1;Password=hyzhhyzh;User ID=hyzh;Data Source=ORA9I;Persist Security Info=True';
var  HY_load7: ArrayOfHY_ZXQJ;
     sWebServiceSoap :WebServiceSoap;
     zhuangicount:Integer=0;
     xiecount :Integer=0;
     AdoErrorMsg:Integer;{定义上传数据过程,此过程从数据库取出数据并打包到数组}
procedure UpDataFun(Connectstr: TPstring);stdcall;
var
  StrSQL,str1,str2:String;
  i :Integer;
  path:AnsiString;
  TempStr:string;
  ini:TIniFile;
  zhuan7jiaQuery,xie7jiaQuery:TADOQuery;
  f:TextFile;
  k: Boolean ;
  HTTPRIO1: THTTPRIO;
begin
  CoInitialize(nil);
  ThreadFettle:=True;
  //TempStr:=Connectstr^;
  path := ExtractFilePath(ParamStr(0)) + 'HYConfigFile.Ini';
  Ini := TIniFile.Create(path);
  //strZM := Ini.ReadString('HJZongHeParameterConfig','ShangBaoZM','');  //从配置文件读取上报站名
  Ini.Free;////释放INI文件  str1:='select * from td_load where RXSJ>TO_DATE(''' + FormatDateTime('yyyy-mm-dd',now-1) + ''',''yyyy-mm-dd'')';      //只取一天的数据
  str2:='select * from td_unload where RXSJ>TO_DATE(''' + FormatDateTime('yyyy-mm-dd',now-1) + ''',''yyyy-mm-dd'')';
  try
    zhuan7jiaQuery:=TADOQuery.Create(nil);
    zhuan7jiaQuery.ConnectionString:=Connectstr^;
    //zhuan7jiaQuery.SQL.Clear;
    zhuan7jiaQuery.SQL.Add(str1);    xie7jiaQuery:=TADOQuery.Create(nil);
    xie7jiaQuery.ConnectionString:=Connectstr^;
    xie7jiaQuery.SQL.Clear;
    xie7jiaQuery.SQL.Add(str2);    zhuan7jiaQuery.Open;
    xie7jiaQuery.Open;
    zhuangicount:=zhuan7jiaQuery.RecordCount;
    xiecount:=xie7jiaQuery.RecordCount;    if (zhuan7jiaQuery.RecordCount>0) or (xie7jiaQuery.RecordCount>0)then
      begin
        SetLength(HY_load7,zhuangicount + xiecount);
        for i:=0 to zhuangicount-1 do
          begin
            HY_load7[i]       :=HY_ZXQJ.Create;
            HY_load7[i].ZCID  :=Trim(zhuan7jiaQuery.fieldbyname('ZCID').AsString);
            HY_load7[i].JHH   :=Trim(zhuan7jiaQuery.fieldbyname('JHH').AsString);
            HY_load7[i].HP    :=Trim(zhuan7jiaQuery.fieldbyname('HP').AsString);
            HY_load7[i].CH    :=Trim(zhuan7jiaQuery.fieldbyname('CH').AsString);
            HY_load7[i].CX    :=Trim(zhuan7jiaQuery.fieldbyname('CX').AsString);
            if zhuan7jiaQuery.fieldbyname('BZ').AsString<>'' then
              HY_load7[i].BZ    :=zhuan7jiaQuery.fieldbyname('BZ').AsFloat;
            if zhuan7jiaQuery.fieldbyname('HPZ').AsString<>'' then
              HY_load7[i].HPZ   :=zhuan7jiaQuery.fieldbyname('HPZ').AsFloat;
            HY_load7[i].PM    :=Trim(zhuan7jiaQuery.fieldbyname('PM').AsString);
            HY_load7[i].PL    :=Trim(zhuan7jiaQuery.fieldbyname('PL').AsString);
            HY_load7[i].ZCDD  :=Trim(zhuan7jiaQuery.fieldbyname('ZCDD').AsString);
            HY_load7[i].DZM   :=Trim(zhuan7jiaQuery.fieldbyname('DZM').AsString);
            HY_load7[i].FZM   :=Trim(zhuan7jiaQuery.fieldbyname('FZM').AsString);
            HY_load7[i].DJ    :=Trim(zhuan7jiaQuery.fieldbyname('DJ').AsString);
            HY_load7[i].PBH   :=Trim(zhuan7jiaQuery.fieldbyname('PBH').AsString);
            HY_load7[i].SHR_  :=Trim(zhuan7jiaQuery.fieldbyname('SHR').AsString);
            HY_load7[i].GDMC  :=Trim(zhuan7jiaQuery.fieldbyname('GDMC').AsString);
            HY_load7[i].TYR   :=Trim(zhuan7jiaQuery.fieldbyname('TYR').AsString);
            if zhuan7jiaQuery.fieldbyname('JS').AsString<>'' then
              HY_load7[i].JS    :=zhuan7jiaQuery.fieldbyname('JS').AsInteger;
            if zhuan7jiaQuery.fieldbyname('DDSJ').AsString<>'' then
              HY_load7[i].DDSJ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('DDSJ').AsDateTime);
            if zhuan7jiaQuery.fieldbyname('RXSJ').AsString<>'' then
              HY_load7[i].RXSJ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('RXSJ').AsDateTime);
            if zhuan7jiaQuery.fieldbyname('KSSJ').AsString<>'' then
              HY_load7[i].KSSJ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('KSSJ').AsDateTime);
            if zhuan7jiaQuery.fieldbyname('JSSJ').AsString<>'' then
              HY_load7[i].JSSJ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('JSSJ').AsDateTime);
            if zhuan7jiaQuery.fieldbyname('CXSJ').AsString<>'' then
              HY_load7[i].CXSJ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('CXSJ').AsDateTime);
            if zhuan7jiaQuery.fieldbyname('ZCRQ').AsString<>'' then
              HY_load7[i].ZCRQ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('ZCRQ').AsDateTime);
            HY_load7[i].JSL   :=Trim(zhuan7jiaQuery.fieldbyname('JSL').AsString);
            HY_load7[i].DJR   :=Trim(zhuan7jiaQuery.fieldbyname('DJR').AsString);
            if zhuan7jiaQuery.fieldbyname('BCSJ').AsString<>'' then
              HY_load7[i].BCSJ  :=DateTimeToXSDateTime(zhuan7jiaQuery.fieldbyname('BCSJ').AsDateTime);
            HY_load7[i].ZCFA  :=Trim(zhuan7jiaQuery.fieldbyname('ZCFA').AsString);
            HY_load7[i].ZCZYLB:=Trim(zhuan7jiaQuery.fieldbyname('ZCZYLB').AsString);
            HY_load7[i].ZCCLLB:=Trim(zhuan7jiaQuery.fieldbyname('ZCCLLB').AsString);
            HY_load7[i].ZCTLSJ:=Trim(zhuan7jiaQuery.fieldbyname('ZCTLSJ').AsString);
            HY_load7[i].ZHCYSCS:=Trim(zhuan7jiaQuery.fieldbyname('ZHCYSCS').AsString);
            HY_load7[i].ZHCYSSJ:=Trim(zhuan7jiaQuery.fieldbyname('ZHCYSSJ').AsString);
            HY_load7[i].ZHCYSFY:=Trim(zhuan7jiaQuery.fieldbyname('ZHCYSFY').AsString);
            HY_load7[i].PBH1  :=Trim(zhuan7jiaQuery.fieldbyname('PBH1').AsString);
            HY_load7[i].PBH2  :=Trim(zhuan7jiaQuery.fieldbyname('PBH2').AsString);
            HY_load7[i].PBH3  :=Trim(zhuan7jiaQuery.fieldbyname('PBH3').AsString);
            HY_load7[i].PBH4  :=Trim(zhuan7jiaQuery.fieldbyname('PBH4').AsString);
            HY_load7[i].SFH1  :=Trim(zhuan7jiaQuery.fieldbyname('SFH1').AsString);
            HY_load7[i].SFH2  :=Trim(zhuan7jiaQuery.fieldbyname('SFH2').AsString);
            //HY_load7[i].FZM   :=  发站名,以后加我们的站名略码字段
            HY_load7[i].ZXBZ  :='Z';
            zhuan7jiaQuery.Next;
          end;  
代码没完,后面还有,

解决方案 »

  1.   

    下面是后面部分,有点长,没法。全贴出来就是想大家帮我看看。        for i:=zhuangicount to (zhuangicount + xiecount)-1 do
              begin
                HY_load7[i]       :=HY_ZXQJ.Create;
                HY_load7[i].XCXHID  :=Trim(xie7jiaQuery.fieldbyname('XCXHID').AsString);
                HY_load7[i].DDCC    :=Trim(xie7jiaQuery.fieldbyname('DDCC').AsString);
                HY_load7[i].XCDD    :=Trim(xie7jiaQuery.fieldbyname('XCDD').AsString);
                if xie7jiaQuery.fieldbyname('XCRQ').AsString<>'' then
                  HY_load7[i].XCRQ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('XCRQ').AsDateTime);
                HY_load7[i].XCZYLB  :=Trim(xie7jiaQuery.fieldbyname('XCZYLB').AsString);
                HY_load7[i].XCCLLB  :=Trim(xie7jiaQuery.fieldbyname('XCCLLB').AsString);
                HY_load7[i].XCTLSJ  :=Trim(xie7jiaQuery.fieldbyname('XCTLSJ').AsString);
                HY_load7[i].XHCYSCS :=Trim(xie7jiaQuery.fieldbyname('XHCYSCS').AsString);
                HY_load7[i].XHCYSSJ :=Trim(xie7jiaQuery.fieldbyname('XHCYSSJ').AsString);
                HY_load7[i].XHCYSFY :=Trim(xie7jiaQuery.fieldbyname('XHCYSFY').AsString);
                HY_load7[i].HP      :=Trim(xie7jiaQuery.fieldbyname('HP').AsString);
                HY_load7[i].CH      :=Trim(xie7jiaQuery.fieldbyname('CH').AsString);
                HY_load7[i].CX      :=Trim(xie7jiaQuery.fieldbyname('CX').AsString);
                HY_load7[i].PM      :=Trim(xie7jiaQuery.fieldbyname('PM').AsString);
                HY_load7[i].PL      :=Trim(xie7jiaQuery.fieldbyname('PL').AsString);
                HY_load7[i].FZM     :=Trim(xie7jiaQuery.fieldbyname('FZM').AsString);
                HY_load7[i].DZM     :=Trim(xie7jiaQuery.fieldbyname('DZM').AsString);
                HY_load7[i].PBH     :=Trim(xie7jiaQuery.fieldbyname('PBH').AsString);
                HY_load7[i].TYR     :=Trim(xie7jiaQuery.fieldbyname('TYR').AsString);
                HY_load7[i].SHR_    :=Trim(xie7jiaQuery.fieldbyname('SHR').AsString);
                HY_load7[i].GDMC    :=Trim(xie7jiaQuery.fieldbyname('GDMC').AsString);
                if xie7jiaQuery.fieldbyname('JS').AsString<>'' then
                  HY_load7[i].JS      :=xie7jiaQuery.fieldbyname('JS').AsInteger;;
                if xie7jiaQuery.fieldbyname('DDSJ').AsString<>'' then
                  HY_load7[i].DDSJ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('DDSJ').AsDateTime);
                if xie7jiaQuery.fieldbyname('RXSJ').AsString<>'' then
                  HY_load7[i].RXSJ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('RXSJ').AsDateTime);
                if xie7jiaQuery.fieldbyname('KSSJ').AsString<>'' then
                  HY_load7[i].KSSJ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('KSSJ').AsDateTime);
                if xie7jiaQuery.fieldbyname('JSSJ').AsString<>'' then
                  HY_load7[i].JSSJ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('JSSJ').AsDateTime);
                if xie7jiaQuery.fieldbyname('CXSJ').AsString<>'' then
                  HY_load7[i].CXSJ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('CXSJ').AsDateTime);
                HY_load7[i].JSL     :=Trim(xie7jiaQuery.fieldbyname('JSL').AsString);
                HY_load7[i].DJR     :=Trim(xie7jiaQuery.fieldbyname('DJR').AsString);
                if xie7jiaQuery.fieldbyname('BCSJ').AsString<>'' then
                  HY_load7[i].BCSJ    :=DateTimeToXSDateTime(xie7jiaQuery.fieldbyname('BCSJ').AsDateTime);
                HY_load7[i].PBH1    :=Trim(xie7jiaQuery.fieldbyname('PBH1').AsString);
                HY_load7[i].PBH2    :=Trim(xie7jiaQuery.fieldbyname('PBH2').AsString);
                HY_load7[i].PBH3    :=Trim(xie7jiaQuery.fieldbyname('PBH3').AsString);
                HY_load7[i].PBH4    :=Trim(xie7jiaQuery.fieldbyname('PBH4').AsString);
                HY_load7[i].SFH1    :=Trim(xie7jiaQuery.fieldbyname('SFH1').AsString);
                HY_load7[i].SFH2    :=Trim(xie7jiaQuery.fieldbyname('SFH2').AsString);
                if xie7jiaQuery.fieldbyname('HPZ').AsString<>'' then
                  HY_load7[i].HPZ     :=xie7jiaQuery.fieldbyname('HPZ').AsFloat;
                if xie7jiaQuery.fieldbyname('BZ').AsString<>'' then
                  HY_load7[i].BZ      :=xie7jiaQuery.fieldbyname('BZ').AsFloat;
                HY_load7[i].ZXBZ    :='X';
                xie7jiaQuery.Next;
              end;
          end;
      except
        on E:Exception do
         begin
           CommonFunctionUnit.AccessLog('log\装七甲log.log',E.Message,-2,zhuangicount);
           CommonFunctionUnit.AccessLog('log\卸七甲log.log',E.Message,-2,xiecount);
           AdoErrorMsg := 1;     end;
      end;
      if AdoErrorMsg <> 1 then
      begin
        if HY_load7<>nil then
        begin
          HTTPRIO1:=THTTPRIO.Create(nil);
          HTTPRIO1.HTTPWebNode.Agent:='Borland SOAP 1.2';
          HTTPRIO1.HTTPWebNode.UseUTF8InHeader:=True;
          HTTPRIO1.WSDLLocation:= WebServiceSoap_location;
          SWebServiceSoap := (HTTPRIO1 as WebServiceSoap);
          sWebServiceSoap := GetWebServiceSoap(False,WebServiceSoap_location,HTTPRIO1);
          try
            k := SWebServiceSoap.AddHY_ZXQJ(HY_load7);
            if k  then
              begin
                CommonFunctionUnit.AccessLog('log\装七甲log.log','',1,zhuangicount);
                CommonFunctionUnit.AccessLog('log\卸七甲log.log','',1,xiecount);
              end
            else
              begin
                CommonFunctionUnit.AccessLog('log\装七甲log.log','',0,zhuangicount);
                CommonFunctionUnit.AccessLog('log\卸七甲log.log','',0,xiecount);
              end;
          except
            on E:Exception do
              begin
                CommonFunctionUnit.AccessLog('log\装七甲log.log',E.Message,-1,zhuangicount);
                CommonFunctionUnit.AccessLog('log\卸七甲log.log',E.Message,-1,xiecount);
              end;
          end;
          HTTPRIO1.Free;
        end;
      end;
      if HY_load7<>nil then
      begin
        for i:=Length(HY_load7)-1 downto 0 do if Assigned(HY_load7[i]) then HY_load7[i].Free;
      end;  zhuan7jiaQuery.Free;
      xie7jiaQuery.Free;
      CoUninitialize;
      ThreadFettle:=False;
      MainForm.ThreadI:=1;
    end;
    end.
      

  2.   

    说实话,代码很多,估计都不想看这么多代码
    你可以写个简单的类似问题的DEMO  贴出来,让大家看下!
      

  3.   

    多线程无非就是一些数据共享方面的问题!你代码太多不想看完,]
      CoInitialize(nil);
      ThreadFettle:=True;
    这2句你应该调换位置!我想ThreadFettle:=True;你这句的作用应该是想该函数只能运行一个实例吧!如果你在你的定时器里面没有判断ThreadFettle:=True;的话,你还应该在begin下面第一句 先判断