【发布时间】:2019-08-09 17:17:20
【问题描述】:
当我运行这段代码时:
FMyThread := TThread.createAnonymousThread(
procedure
begin
while not FMyThread.CheckTerminated do begin
sleep(750);
TThread.synchronize(nil,
procedure
begin
if FMyThread.CheckTerminated then exit;
....
end);
end;
end);
FMyThread.start;
我有例外
无法在外部创建的线程上调用 CheckTerminated
为什么?
【问题讨论】:
-
查看this页面,我想对你有帮助
-
附带说明,保留对匿名线程的引用并期望使用它是非常危险的。一旦你启动它,它就毫无意义,因为线程可能会在你想使用它的时候终止。相反,只需在一次通话中使用
TThread.CreateAnonymousThread( ... ).Start;。 -
我怀疑这里有误会。当您调用 CheckTerminated 时,您的目标是什么?
-
简单的解决方案是不要从
Synchronize中依赖它,它应该只有最少的代码和非常短的执行时间。毕竟,这首先是线程背后的主要思想,以保持主线程响应。如果您担心线程在Synchronize中终止,那么您需要重新考虑您的设计。此类检查应在实际线程本身的上下文中进行,而不是在Synchronize(主线程)中进行。就个人而言,我认为任何人都希望在Synchronize中获取此信息的原因为零。
标签: delphi delphi-xe2