json - 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;
另一方面,完成需要时间,并且屏幕会长时间保持阻塞状态。
解决方案
你没有做错任何事(好吧,除了完全没有任何错误处理)。这就是 Indy 的设计方式(请参阅Indy 简介)。Indy 使用阻塞套接字操作。当您执行操作时,调用线程将被阻塞,直到操作完成。这个是正常的。
如果您不希望您的 UIPOST
在运行过程中被冻结,您可以:
将组件拖放
TIdAntiFreeze
到您的表单上。当 Indy 阻塞主 UI 线程时,它将在后台发送 UI 消息。使用, ,等将
POST
代码移动到它自己的工作线程,并让它在完成时通知主 UI 线程。TThread
TTask
TIdThreadComponent
推荐阅读
- node.js - 错误:无法加载 gRPC 二进制模块,因为在尝试从 docker 容器运行时没有为当前系统安装它
- python - 我可以反转 ttk.Notebook 显示内容框架的方式吗?
- java - hashmap 也可以是返回类型的函数吗?
- python-3.x - 我正在用硒做一个小项目,但它太慢了
- list - 从 Haskell 中的列表中返回最后 n 个元素
- javascript - explorer.exe 在 WSL 中以编程方式运行时无法打开正确的文件夹
- sql - SQL Server 数据透视查询 - 问题
- html - 为什么我的网站上不应该有滚动条?
- javascript - 如何通过此文本框将多行添加到不同的 div / span 标签中?
- javascript - 在单独的文件中更改文本区域的颜色