Форма заблокирована, пока сообщение HTTP не завершено - PullRequest
0 голосов
/ 14 декабря 2018

Я отправляю JSON на конечную точку, и у меня возникла проблема.Выполнение работает, но форма застревает до тех пор, пока не закончится HTTP.Post(), после того как он завершит выпуск экрана для использования.Я уверен, что делаю что-то не так.

Вот действие кнопки, которое отправляет JSON:

procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  vJsonAEnviar: TStringStream;
  Json:String;
begin
  Json := '{ '+
          ' "user":"Lucy"'+
          ' "execute":"ok"'+
          ' } ';
  HTTP := TIdHTTP.Create;
  HTTP.Request.ContentType := 'application/json';
  HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  vJsonAEnviar := TStringStream.Create(UTF8Encode(Json));
  HTTP.Post('http://localhost:8080/exportaManual', vJsonAEnviar);
  FreeAndNil(HTTP);
  FreeAndNil(vJsonAEnviar);
end;

С другой стороны, требуется время, чтобы закончить, и экран остаетсяБлокдор долгое время.

1 Ответ

0 голосов
/ 14 декабря 2018

Вы не делаете ничего плохого (ну, за исключением полного отсутствия какой-либо обработки ошибок).Это просто то, как Indy предназначен для работы (см. Введение в Indy ).Indy использует блокирующие операции с сокетами.При выполнении операции вызывающий поток блокируется до завершения операции.Это нормально.

Если вы не хотите, чтобы ваш пользовательский интерфейс был заморожен во время выполнения POST, вы можете:

  • удалить компонент TIdAntiFreezeна вашу форму.Он будет качать сообщения пользовательского интерфейса в фоновом режиме, пока Indy блокирует основной поток пользовательского интерфейса.

  • переместить код POST в собственный рабочий поток, используя TThread, TTask,TIdThreadComponent и т. Д., И он должен уведомить основной поток пользовательского интерфейса о завершении.

...