繁体   English   中英

IdHTTP获取响应线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM