表单在 HTTP post 未完成时被阻止
Form blocked while HTTP post does not finish
我正在向端点发送 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 设计 的操作方式(参见 Introduction to Indy)。 Indy 使用阻塞套接字操作。当您执行操作时,调用线程将被阻塞,直到操作完成。这是正常的。
如果您不想在 POST
进行时冻结您的 UI,您可以:
将 TIdAntiFreeze
组件拖放到您的表单上。当 Indy 阻塞主 UI 线程时,它将在后台发送 UI 消息。
将 POST
代码移动到它自己的工作线程,使用 TThread
、TTask
、TIdThreadComponent
等,并让它通知主 UI 线程完成后。
我正在向端点发送 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 设计 的操作方式(参见 Introduction to Indy)。 Indy 使用阻塞套接字操作。当您执行操作时,调用线程将被阻塞,直到操作完成。这是正常的。
如果您不想在 POST
进行时冻结您的 UI,您可以:
将
TIdAntiFreeze
组件拖放到您的表单上。当 Indy 阻塞主 UI 线程时,它将在后台发送 UI 消息。将
POST
代码移动到它自己的工作线程,使用TThread
、TTask
、TIdThreadComponent
等,并让它通知主 UI 线程完成后。