如何防止线程冻结Delphi中的主应用程序



我正在做一个Delphi项目。我创建了一个类,它可以帮助我在线程中连接到网络;

我有问题。这个线程冻结主应用程序,直到收到全部响应

所以我需要你的帮助来克服这个挑战。

Web.pas

unit Web;
interface
uses
SysUtils, Classes, IdBaseComponent, Dialogs,
IdComponent,
IdTCPConnection,
IdTCPClient,
IdHTTP,
idMultipartFormData;
type
TCallBack = reference to procedure(res: String);
type
TWebThread = class(TThread)
private
iniRes, iniURL: String;
iniParams: TStringList;
iniCallBack: TCallBack;
Error : String;
// var iniCallBack: reference to procedure(arg1:string);
public
constructor Create(url:String; Params:TStringList; CallBack:TCallBack);
// destructor Destroy; override;
procedure Execute(); override;
end;
implementation
constructor TWebThread.Create(url:String; Params:TStringList; CallBack:TCallBack);
begin
FreeOnTerminate := True;
inherited Create(false);
Self.FreeOnTerminate := True;
Self.iniURL := url;
Self.iniCallBack := CallBack;
Self.iniParams := TStringList.Create;
iniParams.Assign(Params);
end;

procedure TWebThread.Execute();
var
lParam: TIdMultipartFormDataStream;
IHTTP: TIDHTTP;
i:Integer;
begin
// inherited;
IHTTP := TIDHTTP.Create(nil);
lParam := TIdMultipartFormDataStream.Create;
IHTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36';
for i := 0 to iniParams.Count-1 do
begin
lParam.AddFormField(iniParams.Names[i], iniParams.ValueFromIndex[i]);
end;


try
try
iniRes := IHTTP.Post(iniURL, lParam);
Synchronize(PROCEDURE
BEGIN
iniCallBack(iniRes);
END);

Except
on E: Exception do
Error := E.ClassName + ' error raised, with message : ' + E.Message;
end;
finally
FreeAndNil(IHTTP);
FreeAndNil(iniParams);
end;
end;
end.

以下是如何使用:

procedure TMainForm.Button2Click(Sender: TObject);
var
Params: TStringList;
Web: TWebThread;
begin
Params := TStringList.Create;
Params.AddPair('Name','Ahmad');
Params.AddPair('Family','Khaliq');
Web := TWebThread.Create('http://localhost/get.php', Params,procedure (res : string)
begin
Label1.Caption := res;
end);
Web.Execute;
end;

这是我的问题:这个线程,冻结主应用程序,直到它接收到整个idHTTP响应

我认为(但尚未验证(原因是您对Web的显式调用。从主线程执行。

线程的Execute方法应该(并且将自动(从线程本身内部调用,而不是从主线程调用。

因此,请尝试删除Web。执行调用,看看这是否不能解决您遇到的问题。

同步代码提取:

if (CurrentThread.ThreadID = MainThreadID) and not (QueueEvent and ForceQueue) then
begin
if Assigned(ASyncRec.FMethod) then
ASyncRec.FMethod()
else if Assigned(ASyncRec.FProcedure) then
ASyncRec.FProcedure();
end else

最新更新