• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi [Restrequest] Как сделать запрос в потоке?

  • Автор темы Автор темы Lomanu4
  • Дата начала Дата начала

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Всем привет.

Вообщем пытаюсь синхронизировать свою локальную базу с сервером, использую при этом Restrequest,все идет нормально но только приложение зависает на время цикла.

В цикле идет перебор все данных в локальной базе и заносится по ссылке в базу.

Пытался сделать в потоке но выскакивает ошибка "Argument errore", а без потока не выскакивает.

Есть решение для улучшения скорости или хотя бы убрать зависания приложения?

спасибо за ранее за вашу помощь.

Код:
var
  aggiornarichiesta: TJSONObject;
  i,b: Integer;
  a:TStream;
begin

  FDTable1.First;
  for i := 0 to FDTable1.RecordCount do
  begin
    if RESTRequest1.Response.StatusCode = 200 then
    begin

        try
         RESTRequest1.ClearBody;
          RESTClient1.BaseURL := 'http://localhost/loman/dati.php';
         RESTRequest1.Execute;



          aggiornarichiesta := TJSONObject.Create;
          aggiornarichiesta.AddPair('id', FDTable1ID.Text);
          aggiornarichiesta.AddPair('Materiale',
            FDTable1.FieldByName('Materiale').AsString);
          aggiornarichiesta.AddPair('Descripzione',
            FDTable1.FieldByName('Descripzione').AsString);
          aggiornarichiesta.AddPair('Quantita', FDTable1.FieldByName('Quantita')
            .AsString);
          aggiornarichiesta.AddPair('Treno', FDTable1.FieldByName('Treno')
            .AsString);
          aggiornarichiesta.AddPair('Discorta', FDTable1.FieldByName('Discorta')
            .AsString);
          aggiornarichiesta.AddPair('Commento', FDTable1.FieldByName('Commento')
            .AsString);
          aggiornarichiesta.AddPair('Creatoda', FDTable1.FieldByName('Creatoda')
            .AsString);
          aggiornarichiesta.AddPair('Ordinato', FDTable1.FieldByName('Ordinato')
            .AsString);

          RESTClient1.BaseURL := 'http://localhost/loman/Product/update.php';
          RESTRequest1.ClearBody;
          RESTRequest1.AddBody(aggiornarichiesta.ToString,
            ContentTypeFromString('application/json'));
          RESTRequest1.Execute;
          FDTable1.Next;
          RESTRequest1.ClearBody;
          RESTClient1.BaseURL := 'http://localhost/loman/dati.php';
          RESTRequest1.Execute;
        finally
          RESTRequest1.DisposeOf;
        end;



    end;

  end;
 
Ришение
Код:
TTask.Run(
    procedure
    var
      //Какие то переменные
    begin
      //тут пишешь код, который никак не изменяет свойства визуальных компонентов
      //Это может быть например запрос на сервер или работа с большим объемом данных
      //в твоем случае это(RESTRequest надо тут же и создать):
      RESTRequest.ClearBody;
      RESTClient.BaseURL := 'http://localhost/loman/dati.php';
      RESTRequest.Execute;
      TThread.Synchronize(TThread.CurrentThread,
          procedure
        var
          //переменные
        begin
            //тут пишешь код который изменяет свойства визуальных компонентов.
            //т.е. получил например от сервера JSON тут его распарсил и отдал
            //на вывод
        end);
    end);
 
Вверх Снизу