【问题标题】:Overcoming Windows User Object Handle Limit克服 Windows 用户对象句柄限制
【发布时间】:2008-10-02 21:53:57
【问题描述】:

我正在寻找在构建重量级 Windows 界面时处理用户对象句柄限制的高级策略。请说明您如何使用 SWT 或直接 Windows GUI API 克服或绕过此问题。我唯一不感兴趣的是优化小部件使用的策略,因为我已经广泛地这样做了,它并没有解决问题,只会降低可能性。

我的情况:
我有一个基于 SWT 的 GUI,它允许在同一个父 shell 中进行多个会话,并且在每个会话中它们是显示用户生成的 cmets 列表的 3 个独立位置。当用户打开多个会话并拉取填充这些列表的数据时,用户对象句柄的数量会根据 cmets 的数量急剧增加。

我目前的解决方案:
1. 默认情况下,我对 cme​​ts 进行分页,从而限制了每个会话中的评论行数,但由于管理需求,我还有一个有效的“查看全部”按钮,它完全绕过了这一点。
2.我自定义在每一行中绘制所有不可编辑的信息。这意味着每行仅使用 2 个对象句柄。
3. 我创建了 JNI 调用来查询操作系统的当前使用情况和最大使用情况。有了这个,我可以向用户表明崩溃迫在眉睫。不用说,他们忽略了这个警告。

【问题讨论】:

  • 嗨,Spencer,您是如何实施解决方案 3 的?

标签: user-interface winapi swt


【解决方案1】:

首先,您确定问题不在于桌面堆与句柄计数吗?每个句柄可以消耗一定数量的 Windows 桌面堆。一个 USER 句柄可能会占用很多空间,有些可能会占用很少的空间。我建议这样做是为了确保当它真的是别的东西时你不会追逐用户句柄计数。 (google 微软的 dheapmon 工具,可能有帮助)

我了解到您可以通过更改注册表中的键来更改句柄的最大值:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\Windows\ USERProcessHandleQuotaGDIProcessHandleQuota

这可能是对用户的短期修复。

我会通过首先弄清楚每个项目需要维护哪些 2 个用户句柄来解决这个问题(比如列表框中的每个项目需要 2 个?)。这似乎很可疑。 User handles 仅适用于少数顶级 Windows UI 对象(Windows、菜单、光标、窗口位置、图标 等...)。我不明白为什么您的小部件需要为每个项目保留 2 个对象(它是一个图标句柄吗??)。

如果你想把整个事情拆开 - 这听起来像是 virtual-mode List-View (LVS_OWNERDATA) 的工作。

【讨论】:

    【解决方案2】:

    您应该考虑使用无窗口控件。它们正是为这种情况而设计的。见 "Windowless controls are not magic",作者 Raymond Chen

    【讨论】:

    • 在我看来,他并没有创建多个(1000 个)会占用句柄的窗口。听起来好像他的单个(或者是 3 个)窗口每个显示的“项目”都在吃 2 个句柄。
    • 从最初的问题很难判断,但你可能是对的
    【解决方案3】:

    不仅顶级窗口,而且大多数本机控件每个都使用一个用户对象。有关用户和其他句柄类型的深入解释,请参阅Give Me a Handle, and I'll Show You an Object。这也意味着 SWT 对每个小部件至少使用一个用户句柄,即使对于复合材料也是如此。

    如果您确实达到了每个进程 10000 个用户对象的限制,并且没有泄漏,那么您唯一的选择是减少应用程序中小部件实例的数量。我写了一封 blog article 来说明我们是如何为我们的应用程序做到这一点的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多