代码如下:
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,没有找到解决方案,特来请教高手,分大大的奉上。
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,没有找到解决方案,特来请教高手,分大大的奉上。
解决方案 »
- 给出某人的生日,如何得出这个人多大年龄
- 高分!如何下载(或录制)流媒体视频?
- 急~关于获取局域网计算机的SQL数据库的问题
- 有无选用软件公司开发企业信息化软件的标准?
- 打印机和显示器象素问题(简单)
- 求急!!如何在del6中取得execl表格WorkSheet里已有记录的条数?!
- 怎樣才能動態改變dblookupcombobox的高度
- 我只想将网页post的内容(如user=hara&password=kkk&name=steven,现存在文本文件中) 转换成可以读的内容,怎么办呢?100分以上
- 请问怎样才可以使用indy于discuz论坛上传附件?(登录和发帖已经做好了)
- delphi中是否有将字符串中的特定子串,替换为其它子串的函数?
- !!! 50分-控制Speedbutton按扭外框也显示 !!!
- delphi 编译输入问题
你得这段代码是不是放在了连续创建的线程中执行的
-----------------
这段代码是放在主线程,或者单个子线程中运行的。
之所以出现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;
如果在主线程中运行,IdTCPClient在某窗体的FormCreate中创建
如果在子线程中运行,IdTCPClient在线程的Create中创建
代码如下:
FIdSocksInfo:=TIdSocksInfo.Create(nil);
FIdIOHandlerSocket:=TIdIOHandlerSocket.Create(nil);
FIdTCPClient:=TIdTCPClient.Create(nil);
有點意思,你如果是在主線程創建提一個CLIENT,那麼,上面的循環應該不會出什麼問題,INDY是阻塞式的嘛。你是不是在這段代碼省略了什麼大的長期耗資源的代碼?
FIdTCPClient.Connect(6000);
AddToLog('连接成功:'+ip);
Sleep(300); //sleep时间设为2000,也存在同样的问题
FIdTCPClient.Disconnect; 這段中間沒有別的嗎??
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去的,上面的代碼是封裝在一個什麼類裏面的? 呵呵
這術對嘛,不然INDY是阻塞的,上面的不會出現這種情況的,這樣的話,你就管理下開啟線程的數量,應該是線程開的太多了。
最终发现也不是线程的问题,而是前面调用了一个dll,出现内存泄漏造成的。
不过还是感谢大家的热情回复,给分。