首页 > 解决方案 > HTTP post 未完成时表单被阻止

问题描述

我正在将 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;

另一方面,完成需要时间,并且屏幕会长时间保持阻塞状态。

标签: jsondelphiindyidhttp

解决方案


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

如果您不希望您的 UIPOST在运行过程中被冻结,您可以:

  • 将组件拖放TIdAntiFreeze到您的表单上。当 Indy 阻塞主 UI 线程时,它将在后台发送 UI 消息。

  • 使用, ,等将POST代码移动到它自己的工作线程,并让它在完成时通知主 UI 线程。TThreadTTaskTIdThreadComponent


推荐阅读