delphi - 为什么我不能在外部创建的线程上调用 CheckTerminated?
问题描述
当我运行此代码时:
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
为什么 ?
解决方案
如果您查看 CheckTerminated 的实现,您会注意到它不是一个方法,而是一个静态类方法。
CheckTerminated
指示当前正在执行的线程是否将其Terminated
标志设置为TRUE
。当您在 TThread.synchronize 中调用 FMyThread.CheckTerminated 时,它不会检查 FMyThread.Terminated,它会尝试检查“GetCurrentThreadId”的状态,在这种情况下,它是您进程的主线程。
由于主线程不是由 TThread 创建的,因此 RTL 创建了一个TExternalThread
(参见class function TThread.GetCurrentThread: TThread
)
换句话说,如果你有一个 TThread 对象并想检查它是否被终止,你应该调用Terminated
,而不是CheckTerminated
。
由于 AnonymousThread 默认在终止时释放,因此您需要确保清除OnTerminate
处理程序中对线程的任何引用。
推荐阅读
- javascript - 有没有办法让代码循环的一部分而不是另一部分?(p5)
- angular - Angular 多个下标进行相同的 API 调用会导致 init 重复加载
- google-maps-api-3 - 添加动画PNG。谷歌地图API中的折线
- php - 如何在 Laravel 中使用 parent_id 获取子类别中项目的计数和值
- .net - 条目从 ConcurrentDictionary 中消失
- google-apps-script - Google 表格插件未更新
- google-bigquery - BigQuery 中的自加入问题
- qubole - 如何使用 PySpark 升级 Qubole 的 Jupyter Notebook 中的库?
- jenkins - 列出Jenkins存储库中特定目录中的所有文件
- c# - 我无法停止情节提要动画(C# 和 XAML)