Reputation: 83
How use thread for this code, this code makes the program take a quick locked in thread would be better?
how to repeat the thread until 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;
Upvotes: 1
Views: 3653
Reputation: 2488
You can individuate downloading code in a separate function, for example:
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;
Then use an Anonymous thread to fetch the content:
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;
Pay special attention to the GUI update part!
The same could be done with ITask if you were using Delphi XE7.
Note 1: This works fine for small content payload. If you download huge content or file it's better to use a TStream descendant.
Note 2: In this case only one thread will download all URL's content
Upvotes: 4