HTTP发布未完成时表单被阻止

时间:2018-12-14 18:24:49

标签: json delphi indy idhttp

我正在将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 :(得分:6)

您没有做错任何事(好吧,除了完全没有任何错误处理)。这就是Indy被设计进行操作的方式(请参见Introduction to Indy)。 Indy使用阻塞套接字操作。执行操作时,调用线程将被阻塞,直到操作完成。这很正常。

如果您不希望在POST进行期间冻结UI,则可以:

  • TIdAntiFreeze组件拖放到窗体上。当Indy阻止主UI线程时,它将在后台泵送UI消息。

  • 使用POSTTThreadTTask等将TIdThreadComponent代码移至其自己的工作线程,并在何时通知主UI线程完成。