multithreading - 多线程下载字符串 delphi

标签 multithreading delphi

功能

function DownloadString(AUrl: string): string;
var
  LHttp: TIdHttp;
begin
  LHttp := TIdHTTP.Create;
  try
    LHttp.HandleRedirects := true;
    result := LHttp.Get('http://127.0.0.1/a.php?n='+AUrl);
  finally
    LHttp.Free;
  end;
end;

启动

procedure TForm1.Button1Click(Sender: TObject);
var
  LUrlArray: TArray<String>;
begin
  LUrlArray := form1.listbox1.Items.ToStringArray;
  TThread.CreateAnonymousThread(
    procedure
    var
      LResult: string;
      LUrl: string;
    begin
      for LUrl in LUrlArray do
      begin
        LResult := DownloadString(LUrl);
        TThread.Synchronize(nil,
        procedure
        begin
          if Pos('DENEGADA',LResult)>0 then
          begin
            Memo1.Lines.Add(LResult);
          end
          else
          begin
            Memo1.Lines.Add(LResult + 'DIE');
          end;
        end
        );
      end;
    end
  ).Start;
end;

列表框行

http://127.0.0.1/a.php?n=4984
http://127.0.0.1/a.php?n=4986
http://127.0.0.1/a.php?n=4989

在这种情况下,只有一个线程会下载所有 URL 的内容,但我想让它为每个项目创建一个线程...

示例:

thread1 - check item1 listbox - http://127.0.0.1/a.php?n=4984
thread2 - check next item 4986
thread3 - check next item 4989

这个怎么做呢?有什么办法可以做到这一点吗?相信这个方法会更有效。

最佳答案

为了创建单独的线程,您必须像这样绑定(bind) url 变量值:

procedure TForm1.Button1Click(Sender: TObject);
var
  LUrlArray: TArray<String>;
  LUrl: String;

function CaptureThreadTask(const s: String) : TProc;
begin
  Result := 
    procedure
    var 
      LResult : String;
    begin
      LResult := DownloadString(s);
      TThread.Synchronize(nil,
        procedure
        begin
          if Pos('DENEGADA',LResult)>0 then
          begin
            Memo1.Lines.Add(LResult);
          end
          else
          begin
            Memo1.Lines.Add(LResult + 'DIE');
          end;
        end
        );
    end;
end;

begin
  LUrlArray := form1.listbox1.Items.ToStringArray;
  for LUrl in LUrlArray do
    // Bind variable LUrl value like this
    TThread.CreateAnonymousThread( CaptureThreadTask(LUrl)
    ).Start;
end;

参见Anonymous Methods Variable Binding

关于multithreading - 多线程下载字符串 delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36276764/

相关文章:

ios - iPad 应用程序 - 如何使用手指滑动终止服务器调用

delphi - 用delphi进行128位操作

eclipse - 如何在 Eclipse IDE 编辑器中设置一行代码的快捷方式

java - Spring 批处理 FlowJobBuilder : Parallel and sequential execution of "jobStep" type Steps

windows - 当 VAR_LOCALE_USER_DEFAULT 作为参数提供时,是什么导致 VarDateFromStr 无法使用当前用户的区域设置

delphi - 如何将 Delphi ADOTable 过滤器应用于日期数据类型

delphi - 将开放数组传递给匿名函数

java - 使用 ConcurrentHashMap 缓存

Java 将 BufferedOutputStream 存储在数组中

c# - .NET 中的 ManualResetEvent 和 AutoResetEvent 有什么区别?