我正在使用Delphi 2010。
我必须将 UseLatestCommonDialogs
设置为 False
并另外将“打开”和“保存”对话框的 ofOldStyleDialog
属性设置为 true
如果我希望“打开”和“保存”对话框在 Windows 7 中运行
(否则它们根本不会打开)。
我确实为堆栈保留了相当多的空间:
{$M 16384, 60048576}
因为我在大型数据集上使用递归算法。 现在我想知道问题是什么:
新对话框有时看起来非常消耗空间 它们在开始时以及在一组打开和保存之后工作 对话框执行它不再打开对话框 (也许对话框在执行后也不会释放内存?)
Windows 7 中是否存在错误?
还有其他人遇到过类似的问题吗?
在带有古老对话框的 Windows 7 上工作看起来有点奇怪 (它们比 XP 风格更古老,我认为它们看起来像 Windows NT)。
如有任何建议,我们将不胜感激。
提前致谢。
最佳答案
$M
指定的默认堆栈空间分配对于进程中未指定其自身特定要求的所有线程来说是全局的。 60M 对于这个来说已经很大了,远远超过几乎任何堆栈所能增长到的大小。
文件对话框本质上是 Windows 资源管理器的托管版本。它们将 shell 扩展加载到您的进程中,例如缩略图、列处理程序、上下文菜单等。随着 Windows 的功能越来越丰富,MS 和第三方都可以随意使用越来越多的资源(包括线程)来异步添加更多信息,而不阻塞 UI。在我的 Windows 7 64 位计算机上使用 notepad.exe
进行的简单测试显示,对话框之前有 1 个线程,但在对话框打开时有 19 个线程。在默认堆栈预留接近 60M 的 32 位进程中,需要预留超过 1G 的空间,或者默认情况下 32 位应用程序可访问的总地址空间的一半以上。如果应用程序中正在处理大量数据,则很容易发现内存碎片导致地址空间耗尽 - EXE、系统 DLL 等中的所有代码也需要安装在某个地方。 60M 的默认堆栈预留太高了,无法正常工作。
您是否考虑过在您创建的线程中移动深度递归计算?不过,您需要直接使用 System
中的 BeginThread()
,以便显式指定堆栈预留。
或者,是否可以尝试减少算法的堆栈使用?如果要在堆栈上分配记录或数组,请考虑动态分配它们。如果您有一个经常重复出现(嵌套很深)并且有很多局部变量的函数,请考虑创建一个包含局部变量的记录并动态分配它。如果您依赖递归来排序工作(例如,树/图的深度优先遍历),请考虑使用递归来简单地排序工作(例如,将节点添加到列表中),并迭代地进行真正的处理。如果有必要,请考虑重做算法以使用显式堆栈。拥有显式堆栈的另一个优点是,您可以在需要时轻松切换到广度优先,方法是使用队列而不是堆栈,如果堆栈和队列实现使用多态接口(interface),则可以使用单行。
关于delphi - Windows 7 下打开-保存对话框的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745494/