Форма заблокирована, пока сообщение HTTP не завершено
Я отправляю 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 ответ
Вы не делаете ничего плохого (ну, за исключением полного отсутствия какой-либо обработки ошибок). Это просто, как Indy предназначен для работы (см. Введение в Indy). Indy использует блокирующие операции с сокетами. При выполнении операции вызывающий поток блокируется до завершения операции. Это нормально.
Если вы не хотите, чтобы ваш пользовательский интерфейс был заморожен, пока POST
в процессе, вы можете:
брось
TIdAntiFreeze
компонент на вашу форму. Он будет качать сообщения пользовательского интерфейса в фоновом режиме, пока Indy блокирует основной поток пользовательского интерфейса.переместить
POST
код для собственного рабочего потока, используяTThread
,TTask
,TIdThreadComponent
и т. д., и он должен уведомить основной поток пользовательского интерфейса, когда закончите.