gpt4 book ai didi

multithreading - TThread.CreateAnonymousthread/FreeOnTerminate 但随后使用 TTask/ITask

转载 作者:行者123 更新时间:2023-12-03 13:22:47 24 4
gpt4 key购买 nike

背景
使用 TThread.CreateANonymousThread(aProc:TProc)我可以创建一个线程,在线程终止后销毁线程对象。 (或者将 FreeOnTerminate 设置为 true 用于线程对象)。这允许线程启动程序完成并超出范围,而线程继续运行。 (这就是我要找的)

procedure StartProcess
begin

var lTask:=TThread.CreateAnonymousThread(
procedure
begin
... Do lengthy thread stuff here
end
);
...
lTask.Start;
end;
出现的问题是 TTask.Create 返回 ITask当线程发起程序代码删除其上下文时( RefCount 下降到 0 -> Destroy 被调用)释放的接口(interface),导致线程生成 AV。
procedure StartProcess
begin

var lTask:=TTask.Create(
procedure
begin
... Do lengthy thread stuff here
end
);
...
lTask.Start;
end; /// past this point, the subthread wil crash because the underlying task object is destroyed
如果是 OmniThread我们有一个名为 IOmniTaskCOntrol.Unobserved 的解决方案这样可以避免任务对象在完成之前被破坏。
为什么?
编辑:我喜欢 ITask TThread 上的接口(interface)类,因为它允许松散耦合和代码注入(inject)。 (上一页:因为 TThread 可能已被弃用:忘记这一点)
问题
我想知道是否(以及如何!)使用 TTask.Create(aProc:TProc)ITask界面同样可以实现。到目前为止,分析源代码对我没有帮助。

最佳答案

答案很简单:你不必做任何特别的事情。 ITask TTask.Create 返回的接口(interface)InternalExecute 内部也“保留”了通话。方法,所以底层TTask对象将通过引用计数被销毁。如果“主”线程不持有 ITask 接口(interface),子线程会。直到它终止。
所以使用 TTask这种方式非常简单。
注意 :在 RS10.4.2 中这有效,我怀疑使用捕获的接口(interface)变量可能会在 10.4.1 和更早版本中导致问题,因为内联 var 问题与匿名 procs 相结合。 (没试过)

关于multithreading - TThread.CreateAnonymousthread/FreeOnTerminate 但随后使用 TTask/ITask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66422670/

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