[英]IdHTTP Get Response Thread
该代码如何使用线程,这种代码使程序快速锁定在线程中会更好?
如何重复线程直到i = ListBox1.Items.Count -1
var
lURL : String;
lResponse : TStringStream;
begin
lResponse := TStringStream.Create('');
TestText := Form1.ListBox1.Items[i];
I := i +1;
Test1 := Copy(TestText, 0, 16);
Test2 := Copy(TestText, 18, 3);
Test3 := Copy(TestText, 22, 2);
Test4 := Copy(TestText, 27, 2);
try
lURL := 'http://www.test.net/test/test.php' +
'?n=' + Test1 +
'&m=' + Test2 +
'&a=' + Test3 +
'&cv=' + Test4;
idHttp1.Get(lURL, lResponse);
lResponse.Position := 0;
RichEdit1.Lines.LoadFromStream(lResponse);
finally
IdHTTP1.Free;
lResponse.Free();
if Pos('Bazinga',RichEdit1.Text)> 0 then
label1.Caption := 'True';
end;
end;
您可以在单独的函数中个性化下载代码,例如:
function DownloadString(AUrl: string): string;
var
LHttp: TIdHttp;
begin
LHttp := TIdHTTP.Create;
try
LHttp.HandleRedirects := true;
result := LHttp.Get(AUrl);
finally
LHttp.Free;
end;
end;
然后使用匿名线程来获取内容:
procedure TForm3.Button1Click(Sender: TObject);
var
LUrlArray: TArray<String>;
begin
// Your URLs are stored in an array of strings
LUrlArray := form1.listbox1.Items.ToStringArray;
// This will start an anonymous thread to download the string content from the list of URLs
TThread.CreateAnonymousThread(
procedure
var
LResult: string;
LUrl: string;
begin
// Fetch each site content from the URL list
for LUrl in LUrlArray do
begin
// DownloadString will be executed asynchronously
LResult := DownloadString(LUrl);
// Safely update the GUI using TThread.Synchronize or TThread.Queue
TThread.Synchronize(nil,
procedure
begin
// Add the resultant string to ???
// Decide where to set the text to
memo1.Lines.Text := memo1.Lines.Text + LResult;
end
);
end;
end
).Start;
end;
要特别注意GUI更新部分!
如果您使用的是Delphi XE7,则可以使用ITask进行相同的操作。
注意1:此方法适用于较小的内容负载。 如果下载大量内容或文件,则最好使用TStream后代。
注意2:在这种情况下,只有一个线程将下载所有URL的内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.