Delphi FMX中的多线程

时间:2019-01-09 21:18:17

标签: android multithreading delphi firemonkey

我正在尝试遍历TClientDataSet并刷新Android中的TLabelTProgressBar,但出现此错误。我该如何解决?

Error

这是执行过程。这是我第一次在Delphi中使用多线程,我想知道这一点。

希望你能帮助我。

procedure TThreadCatalogos.Execute;
    var i : Integer;
        AppPath : string;
    begin
        AppPath := System.IOUtils.TPath.GetPublicPath;
       ProgressBar.Min := 0;

       for i := round(ProgressBar.Min) to round(ProgressBar.Max) do begin
           // check if Self(thread) is terminated, if so exit
           if Terminated then
              Exit;
           Position := i;

           {*******************************************}

            Conexion.Open;
            //CLIENTES
            dsClientes.Open;
            //mtClientes.EmptyDataSet;
            dsClientes.First;
            ProgressBar.Max := dsClientes.RecordCount;
            while not dsClientes.Eof do
            begin
              if not mtClientes.Locate('nombre',dsClientes.FieldByName('nombre').AsString,[]) then
              begin
                Synchronize(procedure()
                begin
                  mtClientes.Insert;
                  mtClientes.Fields[0].Value := dsClientes.FieldByName('cliente_id').Asinteger;
                  mtClientes.Fields[1].Value := dsClientes.FieldByName('nombre').AsString;
                  mtClientes.Fields[2].Value := dsClientes.FieldByName('tipo').AsString;
                  mtClientes.Post;
                  mtClientes.SaveToFile(System.IOUtils.TPath.combine(AppPath,'CLIENTES.bin'),sfBinary);
                  lbl.Text := 'Cliente '+floattostr(ProgressBar.Value)+' de '+floattostr(ProgressBar.Max);
                  ProgressBar.Value := ProgressBar.Value + 1;
                 end);
              dsClientes.Next;
            end;
            //mtClientes.SaveToFile(System.IOUtils.TPath.combine(AppPath,'CLIENTES.xml'),sfXML);
            mtClientes.First;

            end); Exit;

          end;
           {************************************************}

       end;
    end;

1 个答案:

答案 0 :(得分:0)

要从子线程更新主线程中的进度条,一种方法是:

  1. 使用原子可更新的全局变量,例如您在子线程中更新的32位整数。
  2. 在窗体上使用TTimer事件,该事件基于全局变量中的值更新进度条。

这可以防止过于频繁地更新进度条,并且使线程可以非常快速地更新进度。