【发布时间】:2012-11-26 09:30:19
【问题描述】:
我创建了一个从 TThread 类派生的新类,在构造函数上我调用“inherited Create(True);”,然后调用“Resume()”,因为我已经覆盖了 Execute() 调用,现在我想回忆一下Execute()(再次运行线程)而不破坏类实例,所以我在新类中有一个名为“myRestart()”的函数,它调用“inherited Create(True);”并让我能够再次调用“Resume()”并且线程再次工作。
我的问题是,这是一种安全的做法吗?如果我有这个类的多个实例,它也会起作用吗?还是有更好的方法?
谢谢
【问题讨论】:
-
与其描述代码,不如展示它。
-
还有人想知道为什么要创建一个挂起的线程,然后在构造函数中恢复它。不要一开始就创建它。
-
这不是一个安全的做法。即使使用单个实例,它也不会像您想要的那样工作,是的,有更好的方法来做到这一点。但是……你到底想做什么?
-
@DavidHeffernan - 在早期版本的 Delphi 中,如果使用 'inherited Create(False)' 实例化,线程很有可能会在调用时立即运行,并且在 ctor 完成创建之前/初始化字段。这导致线程试图等待尚不存在的队列和类似的灾难。 AFAIK,后来的 Delphi 版本总是创建在继承调用时挂起的 OS 线程,并只存储参数,以便在 ctor 返回时 OS 线程可以运行/保持挂起。
-
@Martin 在 Delphi 7(及更早版本)中,线程直到 AfterConstruction 才会恢复
标签: multithreading delphi delphi-7 tthread