如何使用线程为这段代码,这段代码使程序快速锁定线程会更好?
如何重复线程,直到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;
答案 0 :(得分:4)
您可以在单独的功能中个别化下载代码,例如:
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: 在这种情况下,只有一个帖子会下载所有网址的内容