全线程库多项任务而不会冻结

时间:2019-12-19 11:53:24

标签: delphi omnithreadlibrary

我需要为TSgringGrid的每一行创建一个任务,该任务将从网页中获取内容,并更新单元格中的数据。

我尝试如下:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 I, nCount : Integer;
begin
 I := 0;
 nCount := 0;

 for I := 1 to StringGrid.RowCount-1 do
   begin

    if StringGrid.Cells[0, I] <> 'done' then
      begin
        inc(Q);
        if Q > 5 then
          Break;

        Async(
         procedure
          begin
             Memo1.lines.add('I=' + I.ToString() + ' Q=' + Q.ToString());
             GetWebContent(I); //Get html a web page and update TStringGrid cell to 'done'
          end
        ).Await(
         procedure
          begin
             Memo1.lines.add('Done I=' + I.ToString() + ' Q=' + Q.ToString());
          end);

      end;
  end;
end;

但是那是行不通的,I的值始终是相同的,我无法获得TStringGrid行的位置。

我该怎么做?在5个任务中创建5个,直到查询完所有网格线为止。

这不能冻结用户界面。

Ps:该代码将在计时器上每5秒进行验证。

谢谢!

0 个答案:

没有答案