delphi – 什么是TExternalThread?终止线程定时器时,“无法终止外部创建的线程”

前端之家收集整理的这篇文章主要介绍了delphi – 什么是TExternalThread?终止线程定时器时,“无法终止外部创建的线程”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是在设计时关闭我的应用程序的一半时间,我已经在我的表单上放置了一个TLMDHiTimer,Enabled设置为true.
在我的OnFormClose事件中,我调用MyLMDHiTimer.Enabled:= false.当这个被调用时,我有时(大约一半的时间)得到这个例外.

我调试并进入调用,发现它是LMDTimer.pas中的行246,给出了这个错误.

FThread.Terminate;

我正在使用最新版本的LMDTools.我在周末之前完成了LMD工具的重新安装,并将组件正确地移除并重新添加到表单中.

从我发现的,这与TExternalThread有关,但是没有Embarcadero的文档,在LMDTools源代码中没有找到任何引用它的内容.

使用完全更新的RAD Studio 2010,Delphi 2010.

真正让我烦恼的是,没有任何文件. Google尝试了一个实际谈论的结果,其中有人说错误是由于尝试终止TExternalThread引起的.
但是看这个LMDHiTimer的源代码,不是一旦它做任何事情,而是创建一个常规的TThread.
我可以找到一个Google结果,Thread: Cannot terminate an externally created thread? 在Embarcadero上提到使用GetCurrentThread()和GetCurrentThreadId()获取挂接到现有线程所需的数据,但TLMDHiTimer没有这样的事情.它只是用自己的Create()构造函数创建自己的TThread后代(当然,被覆盖,并且在构造函数的开头继承的调用)

那么…这个TExternalThread是什么?有没有人遇到这种异常?也许想出一个解决方案或解决方法
对于LMDTools自己的支持,我几乎提出了同样的问题,但是在多个地方都不会有问题.

感谢您提前获得任何帮助.

解决方法

TExternalThread包装Delphi RTL未创建的线程.它可能代表一个属于OS线程池的线程,也可能代表程序中另一个DLL创建的线程.由于线程正在执行不属于关联的TExternalThread类的代码,所以Terminate方法无法通知线程您希望它停止.

Delphi TThread对象会将其Terminated属性设置为True,并且超时执行的Execute方法将期望定期检查该属性,但是由于此线程是非Delphi代码,因此没有Execute方法,并且任何Terminated属性只有线程代码已经写在某个地方(不是通过重写Execute)之后就存在了.

新闻组主题提示您的情况可能发生:

… you have corrupted memory that causes the TThread.FExternalThread member to become a non-zero value.

这可能是由于组件库中的错误,或者可能是由于您自己的代码中的错误.您可以使用调试器的数据断点来尝试找出.在计时器线程的构造函数中设置一个断点.当程序暂停时,使用运行菜单上的“添加断点”命令,使用新对象的FExternalThread字段的地址添加数据断点.此后,如果该字段的值发生变化,调试器将暂停并显示哪些更改. (每次运行程序时,数据断点将被重置,因为IDE假定该对象不会在每次同一地址处分配.)

猜你在找的Delphi相关文章