【发布时间】:2019-10-25 14:21:53
【问题描述】:
我正在开发一个 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 响应
【问题讨论】:
-
正如 HeartWare 所指出的,永远不要显式调用
Execute方法。当CreateSuspended设置为 false 时调用 create ctor 或在CreateSuspended设置为 true 时调用 create 后调用Start时,它会自动调用。请注意,当FreeOnTerminate设置为 true 时,保留对线程的引用是没有意义的,因为如果线程结束,对引用的任何访问都可能导致对无效指针的访问。
标签: multithreading delphi freeze