代码如下:
  SetProXYInfo(FIdSocksInfo);  //设置代理信息
  FIdIOHandlerSocket.SocksInfo:=FIdSocksInfo;
  FIdTCPClient.IOHandler:=FIdIOHandlerSocket;  for m:=1 to 100 do
  begin
    for i:=0 to 3 do  //连接4个不同的主站
    begin
      try
        FIdTCPClient.Host:=ip;    
        FIdTCPClient.Port:=port;        FIdTCPClient.Connect(6000);
        AddToLog('连接成功:'+ip);
        Sleep(300);    //sleep时间设为2000,也存在同样的问题
        FIdTCPClient.Disconnect;
      except
        on E: Exception do
        begin
          AddToLog('连接失败:'+ip+E.Message);
          Sleep(1000);   //sleep时间设为2000,也存在同样的问题
        end;
      end;
    end;
  end;在多台电脑上测试,其中只有一台内存为256m的报错,没报错的电脑内存都超过512m。
报错信息:连接失败:**** thread creation error:存储空间不足,无法处理此命令。
报错时间:一般都能连上,少数时间报错,一旦第一次出现这个错误,后面会连续报错(连接失败)。
该问题搜遍google,没有找到解决方案,特来请教高手,分大大的奉上。

解决方案 »

  1.   

    IdTCPClient在裏面是什麼時候創建的??
      

  2.   

    有可能是你的线程开的数量太多,之前的线程未被释放导致 
    你得这段代码是不是放在了连续创建的线程中执行的
    -----------------
    这段代码是放在主线程,或者单个子线程中运行的。
    之所以出现thread creation error,是因为indy的IdTCPClient.Connect的函数内调用了线程创建连接。
    下面是Indy的代码
      procedure ConnectTimeout(ATimeout: Integer);
      var
        LSleepTime: Integer;
        LInfinite: Boolean;
      begin
        LInfinite := ATimeout = IdTimeoutInfinite;    with TIdConnectThread.Create(True) do try  //报错就在这里,TIdConnectThread.Create
          FBinding := Binding;
          Resume;
          // Sleep
          if TIdAntiFreezeBase.ShouldUse then begin
            LSleepTime := Min(GAntiFreeze.IdleTimeOut, 125);
          end else begin
            LSleepTime := 125;
          end;      if LInfinite then begin
            ATimeout := LSleepTime + 1;
          end;      while ATimeout > LSleepTime do begin
            IdGlobal.Sleep(LSleepTime);
            ATimeout := ATimeout - LSleepTime;        if LInfinite then begin
              ATimeout := LSleepTime + 1;
            end;        TIdAntiFreezeBase.DoProcess;
            if Terminated then begin
              ATimeout := 0;
              Break;
            end;
          end;
          IdGlobal.Sleep(ATimeout);
          //
          if Terminated then begin
            if Length(FExceptionMessage) > 0 then begin
              raise EIdConnectException.Create(FExceptionMessage);
            end;
          end else begin
            Terminate;
            Close;
            WaitFor;
            raise EIdConnectTimeout.Create(RSConnectTimeout);
          end;
        finally Free; end;
      end;
      

  3.   


    如果在主线程中运行,IdTCPClient在某窗体的FormCreate中创建
    如果在子线程中运行,IdTCPClient在线程的Create中创建
    代码如下:
      FIdSocksInfo:=TIdSocksInfo.Create(nil);
      FIdIOHandlerSocket:=TIdIOHandlerSocket.Create(nil);
      FIdTCPClient:=TIdTCPClient.Create(nil);
      

  4.   


    有點意思,你如果是在主線程創建提一個CLIENT,那麼,上面的循環應該不會出什麼問題,INDY是阻塞式的嘛。你是不是在這段代碼省略了什麼大的長期耗資源的代碼?
    FIdTCPClient.Connect(6000); 
            AddToLog('连接成功:'+ip); 
            Sleep(300);    //sleep时间设为2000,也存在同样的问题 
            FIdTCPClient.Disconnect; 這段中間沒有別的嗎??
      

  5.   

      SetProXYInfo(FIdSocksInfo);  //设置代理信息 
      FIdIOHandlerSocket.SocksInfo:=FIdSocksInfo; 
      FIdTCPClient.IOHandler:=FIdIOHandlerSocket;   for m:=1 to 100 do 
      begin 
        for i:=0 to 3 do  //连接4个不同的主站 
        begin 
          try 
            if FIDTcpClient.Connected then FIDTcpClient.DisConnect;
            FIdTCPClient.Host:=ip;    
            FIdTCPClient.Port:=port;         FIdTCPClient.Connect(6000); 
            AddToLog('连接成功:'+ip); 
             FIdTCPClient.Disconnect; 
          except 
            on E: Exception do 
            begin 
              FIdTCPClient.Disconnect;
              AddToLog('连接失败:'+ip+E.Message); 
            end; 
          end; 
        end; 
      end; 
     這麼多個F來F去的,上面的代碼是封裝在一個什麼類裏面的? 呵呵
      

  6.   


    這術對嘛,不然INDY是阻塞的,上面的不會出現這種情況的,這樣的話,你就管理下開啟線程的數量,應該是線程開的太多了。
      

  7.   

    我们老大帮忙找到原因了,是线程的问题,用继承TThread就有问题,用CreateThread就没有问题。
      

  8.   

    问题解决,结贴。
    最终发现也不是线程的问题,而是前面调用了一个dll,出现内存泄漏造成的。
    不过还是感谢大家的热情回复,给分。