gpt4 book ai didi

在 DLL 中使用 TTask 时 Delphi FreeLibrary 卡住

转载 作者:行者123 更新时间:2023-12-01 19:24:59 29 4
gpt4 key购买 nike

这是我在 DLL 中的代码:

procedure TTaskTest;
begin
TTask.Run(
procedure
begin
Sleep(300);
end);
end;
exports TTaskTest;

在宿主应用程序中调用此方法后,然后调用 FreeLibrary将卡住主机应用程序。调试后,我发现程序卡住在 if TMonitor.Wait(FLock, Timeout) thenTLightweightEvent.WaitFor ,但调试器无法进入 TMonitor.Wait 。怎么解决?

最佳答案

已报告此问题 ( RSP-13742 Problem with ITask, IFuture inside DLL )。

它以“按预期工作”结束,并附有评论:

To prevent this failure using ITask or IFuture from a DLL, the DLL will need to be using its own instance of TThreadPool in place of the default instance of TThreadPool.

以下是 Embarcadero 的示例,说明如何处理它:

library TestLib;

uses
System.SysUtils,
System.Classes,
System.Threading;

{$R *.res}

VAR
tpool: TThreadPool;

procedure TestDelay;
begin
tpool := TThreadPool.Create;
try
TTask.Run(
procedure begin
Sleep(300);
end,
tpool
);
finally
FreeAndNil(tpool);
end;
end;

exports
TestDelay;

begin

end.
<小时/>

另一种方法是在加载库时创建线程池,并添加一个释放过程,在调用 FreeLibrary 之前调用该过程。

// In dll 
procedure TestDelay;
begin
TTask.Run(
procedure begin
Sleep(300);
end,
tpool
);
end;

procedure ReleaseThreadPool;
begin
FreeAndNil(tpool);
end;

exports
TestDelay,ReleaseThreadPool;

begin
tpool := TThreadPool.Create;
end.

关于在 DLL 中使用 TTask 时 Delphi FreeLibrary 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41159368/

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