【问题标题】:Problem with Open-Save Dialog boxes under Windows 7Windows 7 下打开保存对话框的问题
【发布时间】:2011-04-14 07:33:47
【问题描述】:

我正在使用 Delphi 2010。 我必须将UseLatestCommonDialogs 设置为 False 并将打开和保存对话框的 ofOldStyleDialog 属性设置为 true 如果我希望打开和保存对话框在 Windows 7 中工作 (否则它们根本不会打开)。 确实,我为堆栈保留了相当多的空间:

{$M 16384, 60048576}

因为我在大型数据集上使用递归算法。 现在我想知道是什么问题:

  1. 有时,新对话框似乎非常占用空间 它们在开始和经过一组打开和保存后工作 对话框执行它不再打开对话框 (也许对话框在执行后也不会释放内存?)

  2. Windows 7 中是否存在错误?

还有其他人遇到过类似的问题吗?

在带有古老对话框的 Windows 7 上工作看起来有点奇怪 (它们甚至比 XP 风格更老,我认为它们看起来像在 Windows NT 中)。

任何建议将不胜感激。

提前致谢。

【问题讨论】:

    标签: delphi windows-7 delphi-2010


    【解决方案1】:

    $M 指定的默认堆栈空间分配对于进程中未指定其特定要求的所有线程都是全局的。 60M 对于这个来说已经很多了,远远超过几乎任何堆栈的增长速度。

    文件对话框本质上是 Windows 资源管理器的托管版本。它们将 shell 扩展加载到您的进程中,用于缩略图、列处理程序、上下文菜单等。随着 Windows 的功能越来越多,MS 和第三方都可以随意使用越来越多的资源(包括线程)来异步添加更多信息,不阻塞用户界面。在我的 Windows 7 64 位机器上使用 notepad.exe 进行的简单测试表明它在对话框之前有 1 个线程,但在对话框打开时有 19 个线程。在默认堆栈保留接近 60M 的 32 位进程中,它希望保留超过 1G 或超过 32 位应用程序默认可访问的总地址空间的一半。如果应用程序中有大量数据正在处理,很容易看到内存碎片导致地址空间不足 - 来自 EXE、系统 DLL 等的所有代码也需要在某个地方适合。 60M 的默认堆栈预留太高,无法正常工作。

    您是否考虑过在您创建的线程中移动深度递归计算?不过,您需要直接使用 System 中的 BeginThread(),才能显式指定堆栈预留。

    或者,是否可以尝试减少算法的堆栈使用量?如果您在堆栈上分配记录或数组,请考虑动态分配它们。如果你有一个经常重复出现的函数(嵌套很深)并且有很多局部变量,请考虑创建一个包含局部变量的记录并动态分配它。如果您依赖于对序列工作的递归(例如树/图的深度优先遍历),请考虑简单地使用递归来对工作进行排序(例如,将节点添加到列表中),并迭代地进行真正的处理。如有必要,请考虑重做算法以使用显式堆栈。使用显式堆栈的另一个优点是,您可以在需要时轻松切换到广度优先,方法是使用队列而不是堆栈,如果堆栈和队列实现使用多态接口,则使用单线。

    【讨论】:

      【解决方案2】:

      非常感谢您:

      “如果您依赖递归来排序工作(例如树/图的深度优先遍历),请考虑使用递归简单地对工作进行排序(例如将节点添加到列表中),并迭代地进行真正的处理。”

      是的,我用它来计算例如图的强连通分量。 我正在使用算法的变体:http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm

      而且我不知道如何在没有递归的情况下做到这一点。 你有什么建议 - 或者指向一个非递归算法的深度 首先搜索图表?

      最好的。

      【讨论】:

      • 这不是对问题的答案,而是对凯利答案的评论
      • 我建议您就该特定主题提出一个单独的问题。另外,我会删除这个答案。
      • 实际上,@Barry,他们可以评论自己的问题和答案以及他人对他们问题的回答。
      • 过去 10 年我得到的最重要的信息。半年多来,我一直在寻找这个问题的答案。但另一方面,根据 RAM 的使用情况,Windows 7 的这种行为是非常低效的,并且其他几个程序会出现问题,尤其是那些使用大量堆栈的程序。收据很简单:“Windows 7 下的程序不要使用栈”。
      【解决方案3】:

      再次感谢这个非常准确的答案。

      我再次测试并得到相同的结果,正如您所写: 其实内存问题是可以预测的:

      1. 我在 Delphi 2010 中检查“胎面状态”: 使用旧对话框时,打开/保存对话框时会出现新的踏板 打开并在关闭时从列表中删除。 使用新对话框执行此操作时,打开/保存对话框产生 6 执行后停止但未删除的线程, 有趣的是:在向 FileName 输入内容时 (不通过鼠标单击从可用文件列表中选择文件) 三个新线程出现,并留在那里,所以已经有 总共 9 个“不需要”线程

      2. 然后在 Windows 任务管理器中查看,您可以看到: “线程数”*“我的应用程序中定义的堆栈”> “可用物理内存”+“系统缓存” 程序会报告内存问题。

      所以目前大约有 10 个线程打开,当然还有大堆栈 有问题。 我只在 XP 上检查过,但在 Windows 7 上,我猜是 生成的线程更大?

      并且没有办法以某种方式杀死这些线程?

      再次感谢,一切顺利。

      “文件对话框本质上是 Windows 资源管理器的托管版本。它们将 shell 扩展加载到您的进程中,用于缩略图、列处理程序、上下文菜单等。随着 Windows 的功能越来越多,MS 和第三方都可以放心使用使用越来越多的资源 - 包括线程 - 以异步方式添加更多信息,而不阻塞 UI。在我的 Windows 7 64 位机器上使用 notepad.exe 进行的简单测试表明它在对话框之前有 1 个线程,但在对话框之前有 19 个线程对话框已打开。在默认堆栈保留接近 60M 的 32 位进程中,它希望保留超过 1G,或默认情况下 32 位应用程序可访问的总地址空间的一半以上。如果有很多数据正在处理完全在应用程序中,”

      【讨论】:

        猜你喜欢
        • 2011-05-30
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多