好吧,这不是最佳实践情况,但幸运的是我有答案,所以请耐心等待。
我正在开发一个相当大的 Delphi 项目,其中使用了很多外部 API。这些 API 以不同的方式插入,包括包装到 DPR 本身的 IFDEF 中的单元(当它们依赖于平台时)。在 DPR 中使用 IFDEF 是一种不好的做法 - 当然,但是让项目树中列出的所有单元在它们之间切换(而不是在项目之间切换)会很方便。
因此,我向项目添加了另一个替代 API 实现,并像往常一样 - 将现有解决方案单元包装到
{$IFDEF SOME_API_DLL}
子句中,并将新的解决方案单元包装到另一个 {$IFDEF SOME_API_EXE}
中。
无论如何,我很快就注意到,在编码了 3-5 分钟后,IDE 就开始半随机冻结,这是难以忍受的代价。IDE 会占用一个 CPU(例如,在 8 核 PC 上为 13%)。我能够将原因隔离为调用“自动完成”、“代码完成”(Ctrl+空格)和“跳转到声明(Ctrl+单击)”。
主要问题是 - 什么可能导致 IDE 冻结如何解决这个问题?
我正在使用Delphi XE8,但切换到其他版本没有帮助。不幸的是,由于第三方组件的原因,较新的 10.3+ 版本(声称重写了 Code Insight)无法测试/使用。
由于该错误与新的 API 实现紧密相关,我能够找到原因。所以看来 IDE 不喜欢带有 IFDEF 的 DPR 文件(旧消息),但真正令人遗憾的是 只有当 IFDEF 只包装一个单元时,IDE 才能正常处理它们。
解决方案的提示是项目树,它会使用 DPR 中的单元自动更新,但它仅自动包含 IFDEF 之后的第一个单元。显然,这也是自动完成功能偏离轨道的原因。
错误的 DPR 结构导致 IDE 在代码完成时冻结:
{$IFDEF EXTAI_API_DLL}
KM_ExtAI_DLL in 'src\KM_ExtAI_DLL.pas',
KM_ExtAI_DLLs in 'src\KM_ExtAI_DLLs.pas',
KM_ExtAI_SharedTypes in 'src\KM_ExtAI_SharedTypes.pas',
KM_ExtAI_SharedInterfaces in 'src\KM_ExtAI_SharedInterfaces.pas',
KM_ExtAIActions in 'src\KM_ExtAIActions.pas',
KM_ExtAIMaster in 'src\KM_ExtAIMaster.pas',
KM_ExtAIStates in 'src\KM_ExtAIStates.pas',
KM_ExtAIUtils in 'src\KM_ExtAIUtils.pas',
{$ENDIF}
良好的 DPR 结构让 IDE 能够正常工作:
{$IFDEF EXTAI_API_DLL}KM_ExtAI_DLL in 'src\KM_ExtAI_DLL.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAI_DLLs in 'src\KM_ExtAI_DLLs.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAI_SharedTypes in 'src\KM_ExtAI_SharedTypes.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAI_SharedInterfaces in 'src\KM_ExtAI_SharedInterfaces.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAIActions in 'src\KM_ExtAIActions.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAIMaster in 'src\KM_ExtAIMaster.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAIStates in 'src\KM_ExtAIStates.pas',{$ENDIF}
{$IFDEF EXTAI_API_DLL}KM_ExtAIUtils in 'src\KM_ExtAIUtils.pas',{$ENDIF}
当我在页面控件上的选项卡之间进行复制和粘贴这样简单的事情时,我在 Delphi 12 中也遇到同样的问题,并且一次只执行半个选项卡(共 12 个)然后必须等待是难以忍受的+/- 40 秒才能解冻。
如果您找到了阻止 IDE 冻结的方法,请分享🙏🙏🙏