怎样在线程(TThread)中使用Indy的TIdHttp控件(100分)

  • 主题发起人 主题发起人 1Fuyi
  • 开始时间 开始时间
1

1Fuyi

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样在线程(TThread)中使用Indy的TIdHttp控件

每一个线程中使用一个动态创建的TIdHttp控件,处理一个Http连接

如不能用TIdHttp控件,怎么用其它的方法来在线程中处理Http连接
 
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.Get(URL, SavedStream);
finally
IdHTTP.Free;
end;
 
IdHTTP是否是线程安全的??
 
你一个线程动态创建一个IdHttp,所以不存在线程安全问题呀
 
谢谢,巳在线程中使用,
只是好象在不断和Get和Post中,会出现内存不断增长的问题
是不是TIdHttp有内存泄漏??
 
要是有很多线程,建议一次创建多个IdHttp实例,也就是IdHttp池,这样就不会出现“只是好象在不断和Get和Post中,会出现内存不断增长的问题”,而且性能好
你说的问题,不是IdHttp的BUG,最好认真看看自己的代码吧。
 
一定是你的代码写的有问题, 我作过一个程序就是用Idhttp不停的下载文件, 一天要下载很多次, 每次都会多线程去下载, 程序运行N天内存都不会涨.[:D]
 
我把代码帖出,烦请查一下错。
还有请问TIdHttp线程池的资料,在什么地方能查到?
procedure TForm1.RegistIn;
var MyThreads: array of TMyThread;
I: Integer;
begin

SetLength(MyThreads, Threads);
for I := Low(MyThreads) to High(MyThreads) do
begin
MyThreads := TMyThread.Create(True);
MyThreads.FreeOnTerminate := True;
MyThreads.Resume;
end;
{for I := Low(MyThreads) to High(MyThreads) do
FreeAndNil(MyThreads);}

end;

procedure TMyThread.Execute;
var I: Integer;
Params: TStrings;
begin
//inherited;
with TIdHttp.Create(nil) do
begin
Host := Form1.AHost;
Port := Form1.APort;
try

for I := 1 to Form1.Times do
begin
try
Connect;
try
Get(Form1.PreUrl + 'register.asp?b_rules=1');
Params := Form1.GetParams; //取得注册参数
Application.ProcessMessages;
Post(Form1.PreUrl + 'register_Save.asp', Params);
if Round(I / Form1.FInterval) = I / Form1.FInterval then
Synchronize(UpdateProgress);
finally
Disconnect;
end; //Try finally
except

end; //Try except
end; //For

finally
Free;
Params.Free;
end; //Try finally
end; //With
Self.Terminate;
end;
 
没仔细看,感觉有问题
》 for I := 1 to Form1.Times do
为何在线程中还有引用主窗体呀,不要这样引用[:)]
 
代码中引用主窗体,是因为参数是在主窗体启动时从1.ini文件中读入的。
如不这样读入,
怎么把参数传到线程的Execute 过程中去??
 
你可以在线程中定义个属性, 在线程执行前赋值. 不过这样用也不会引起内存泄漏的, 你这段代码不会引起内存泄漏的,一定是调用的过程有问题. 你可以先注释掉Params := Form1.GetParams; //取得注册参数 和Synchronize(UpdateProgress);这句试试.还有Params.Free;这一句放的位置有问题,如果get那句发生异常的话, 这一句就会非法操作了.
 
传参数要写对象Mothed,如果直接应用主窗体,会引入问题的。(还是再仔细看看DELPIH5开发人员指南中的 类 有关的话题吧)
 
To:happylcq
对,Params := Form1.GetParams;这句代码应提前.
附加代码帖出
function TForm1.GetParams: TStrings;
var Psw: string;
Params: TStrings;
begin
Params := TStringList.Create;
Params.Clear;
Params.Add('Username=111110');
Params.Add('password=111111');
Params.Add('repassword=111111');
Params.Add('question=11111');
Params.Add('answer=11111');
Params.Add('sfznum=111111111111111111');
Params.Add('realname=11111');
Params.Add('company=11111');
Params.Add('telePhone=2223456');
Result := Params;
end;
procedure TMyThread.UpdateProgress;
begin
Form1.ShowStatus;//仅仅是显示工作进度
end;
 
用以上代码,
线程数为5时,内存大约用到7-8M CPU 1-2
线程数为5时,内存大约用到9-10M CPU 2-4
而当线程线到30时,内存大约用到25-27M CPU 2-6

注释掉Params := Form1.GetParams; //取得注册参数
和Synchronize(UpdateProgress);两句后;
线程线到30时,内存大约用到10M CPU 2-6

经再次测试,问题出在Params := Form1.GetParams;语句,
该语句,巳改成在Params := GetParams;(共用过程);

如不加Params := GetParams;(共用过程);
线程线到30时,内存大约用到10M CPU 2-6

加上此句
线程线到30时,内存大约用到16-18M CPU 4-8

帮忙分析是什么原因?


 
问题巳解决:

Functtion GetParams:Strings;

改成:Procedure GetParams(Var Params:Strings);
让每一个线程都有自己的私有Params,内存不在增大.
 
多人接受答案了。
 
后退
顶部