Многопоточность в Delphi FMX - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь перебрать хотя бы TClientDataSet и обновить TLabel и TProgressBar в Android, но я получаю эту ошибку. Как я могу это исправить?

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 голосов
/ 11 января 2019

Чтобы обновить индикатор выполнения в главном потоке из дочернего потока, необходимо:

  1. Используйте атомарно обновляемую глобальную переменную (переменные), например 32-разрядное целое число, которое вы обновляете в дочернем потоке.
  2. Используйте событие TTimer в форме, которая обновляет индикатор выполнения на основе значений в глобальной переменной (ях).

Это предотвращает слишком частое обновление индикатора выполнения и позволяет потоку очень быстро обновлять информацию о ходе выполнения.

...