gpt4 book ai didi

delphi - 符号 'Resume' 已弃用/线程错误 : The handle is invalid (6)

转载 作者:行者123 更新时间:2023-12-03 14:42:39 26 4
gpt4 key购买 nike

我有一段旧代码,我想将其升级到 Delphi XE。我有一个关于 Resume 的编译器警告,我想用 Start 替换它,但程序崩溃了。

constructor THTTPGetThread.Create(aAcceptTypes, aAgent, aURL, aFileName, aUserName, aPassword, aPostQuery, aReferer: String; aBinaryData, aUseCache: Boolean; aProgress: TOnProgressEvent; aToFile: Boolean);
begin
FreeOnTerminate := True;
inherited Create(True);

FTAcceptTypes := aAcceptTypes;
FTAgent := aAgent;
FTURL := aURL;
FTFileName := aFileName;
FTUserName := aUserName;
FTPassword := aPassword;
FTPostQuery := aPostQuery;
FTReferer := aReferer;
FTProgress := aProgress;
FTBinaryData := aBinaryData;
FTUseCache := aUseCache;
FTToFile := aToFile;

Resume; <------------ works, but I get compiler warning
//Start; <------------ doesn't work
end;

使用 START 时出现的错误是:“线程错误:句柄无效 (6)”。
我不需要复杂的东西(卡住/同步线程)。我只想从互联网下载文件而不阻塞 GUI。

最佳答案

简单的答案是,您不应该创建此线程挂起,因为您希望它立即启动。删除对 Start 的调用并将 False 传递给继承的构造函数。

请注意,直到所有构造函数都运行完成后,线程才会启动,因此含义与您发布的代码相同。

<小时/>

至于您的代码失败的原因,请查看以下源代码摘录:

procedure TThread.AfterConstruction;
begin
if not FCreateSuspended and not FExternalThread then
InternalStart(True);
end;

procedure TThread.InternalStart(Force: Boolean);
begin
if (FCreateSuspended or Force) and not FFinished and not FExternalThread then
begin
FSuspended := False;
FCreateSuspended := False;
if ResumeThread(FHandle) <> 1 then
raise EThread.Create(SThreadStartError);
end
else
raise EThread.Create(SThreadStartError);
end;

procedure TThread.Start;
begin
InternalStart(False);
end;

您的代码使用 CreateSuspished=True 调用继承的构造函数。这会将 FCreateSuspished 设置为 True。然后,您可以在 TThread.AfterConstruction 运行之前调用 Start。这成功启动了线程,但最重要的是,它将 FCreateSuspished 重置为 False。然后,当 TThread.AfterConstruction 时,它会尝试恢复因已在运行而失败的线程。

我认为 Delphi 代码很好,因为从构造函数调用 Start 是不正确的。您需要确保所有构造函数都已运行,并且派生类构造函数在调用 Start 之后运行。您还没有任何派生类,但这不是重点,重点是不支持从构造函数调用 Start

最重要的是,您应该创建一个不挂起的线程,并让 Start 代表您从 AfterConstruction 中调用。

关于delphi - 符号 'Resume' 已弃用/线程错误 : The handle is invalid (6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com