【发布时间】:2012-02-06 22:48:56
【问题描述】:
这就是问题(剩下的只是为了让你告诉我我做错了)。
有什么方法可以确保要运行的第一个二进制文件(即我的可执行文件)是第一个初始化 vcl.controls.pas 的文件?
我问了this question a few months ago,我想出了如何在那里修复它并且同步再次工作,只是为 Delphi 2009 膨胀。
现在我们有了 Delphi XE2,并且出现了同样的症状。 TThread.Synchronize 会一直锁定,直到系统空闲或将鼠标移到活动窗体上,导致程序运行速度非常慢。我可以在 Delphi 2009 中重现该问题,因为我很幸运,发现源是一个非循环链接的 DLL,但我不相信 XE2 会出现这种情况。我不知道为什么 XE2 决定以不同于 Delphi 7 或 2009 的方式初始化代码,但根据我对另一个问题的回答,TThread 并没有真正改变,所以它必须在其他地方。
好吧,我一直在逐步完成我的主 MDI 应用程序的初始化,它似乎在链接的 DLL 中调用了 TApplication.Create(这发生在 VCL.Controls.pas 的初始化中)。我不能说我理解为什么这是一个问题,因为我使用相同的运行时包(VCL、RTL 等)构建所有东西。
【问题讨论】:
-
在我看来,那个 DLL 没有使用运行时包...当您使用运行时包时,所有这些包中应该只有一个对 VCL 的引用。
-
除非有一些隐藏的 .dproj 怪异之处,否则我可以确认每个 DLL 都使用精确的保存运行时包,包括 VCL。实际上,我确实通过将有问题的 DLL 的
external调用转换为调用loadlibrary和getprocaddress的delphi 函数来解决这个问题。
标签: multithreading delphi synchronization delphi-xe2 vcl