在 Delphi 2009 中,我发现每当我在应用程序中使用 TThread.CurrentThread 时,应用程序关闭时我都会收到如下错误消息:
Exception EAccessViolation in module ntdll.dll at 0003DBBA.
Access violation at address 7799DBBA in module 'ntdll.dll'. Write of
address 00000014.
除非它只是我的机器,否则您可以在几秒钟内复制此操作:创建一个新的 Delphi Forms 应用程序,向表单添加一个按钮,并对按钮的事件处理程序使用类似以下内容:
procedure TForm1.Button1Click(Sender: TObject);
begin
TThread.CurrentThread;
end;
在我的 Vista 机器和 XP 机器上我发现,如果我don't单击按钮一切都很好,但如果我do单击按钮关闭应用程序时收到上述错误消息。
所以...我想知道这是否是一个错误,但同时我认为很可能我只是不理解关于如何在 Delphi 中使用 TThreads 的一些非常基本的知识。恐怕我是一个德尔福新手。
像这样使用 Thread.CurrentThread 有明显的问题吗?
如果没有,并且您有 Delphi 2009,那么如果您实现我的简单示例项目,您是否会遇到同样的问题?
更新:正如 François 在下面指出的,这实际上是目前 Delphi 2009 中的一个错误 - 您可以在这里投票 http://qc.codegear.com/wc/qcmain.aspx?d=67726.
更新:该错误已在 Delphi 2010 中修复。
不幸的是,这似乎是与类单元中终结部分的调用顺序相关的错误:
DoneThreadSynchronization
清除ThreadLock
结构,那么
FreeExternalThreads
调用时想要销毁刚刚创建的Thread对象CurrentThread
, and
这需要 ThreadLock 在调用中已经初始化
EnterCriticalSection(ThreadLock)
in TThread.RemoveQueuedEvents
...
UPDATE:
现在有一个解决办法补丁 in the 质检报告 http://qc.codegear.com/wc/qcmain.aspx?d=67726.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)