- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
使用 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/
看来是Synchronize不能从使用 CreateAnonymousThread 创建的线程中使用,所以问题是:如何从使用 CreateAnonymousThread 创建的线程内部更新 VCL 组
背景 使用 TThread.CreateANonymousThread(aProc:TProc)我可以创建一个线程,在线程终止后销毁线程对象。 (或者将 FreeOnTerminate 设置为 tru
我是一名优秀的程序员,十分优秀!