我正在寻找在构建重量级 Windows 界面时处理用户对象句柄限制的高级策略。请解释您如何使用 SWT 或直接 Windows GUI API 克服或绕过此问题。我唯一不感兴趣的是优化小部件使用的策略,因为我已经广泛地这样做了,但它并没有解决问题,只会降低问题的可能性。
我的情况:
我有一个基于 SWT 的 GUI,它允许在同一个父 shell 中进行多个会话,并且在每个会话中,它们有 3 个独立的位置,其中显示用户生成的注释列表。当用户打开多个会话并提取填充这些列表的数据时,用户对象句柄的数量可能会根据评论的数量急剧增加。
我目前的解决方案:
1.我默认对评论进行分页,从而限制每个会话中的评论行数,但由于管理需求,我还有一个有效的“查看全部”按钮,它完全绕过了这一点。
2.我自定义绘制每行中的所有不可编辑信息。这意味着每行仅使用 2 个对象句柄。
3. 我创建了 JNI 调用,用于查询操作系统的当前使用情况和最大使用情况。这样我就可以向用户发出崩溃即将发生的指示。不用说,他们忽略了这个警告。
首先,您确定问题不是桌面堆与句柄数吗?每个句柄都会消耗一定量的 Windows 桌面堆。一个 USER 句柄可能会占用大量空间,有些则占用很少。我建议这样做是为了确保您不会在真正有其他事情时追逐用户句柄计数。 (谷歌搜索微软的 dheapmon 工具,可能会有帮助)
我读到您可以通过更改注册表中的键来更改句柄的最大值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\
当前版本\Windows\USERProcessHandleQuota and GDI进程句柄配额
对于用户来说,这可能是一个短期修复。
我会通过首先弄清楚每个项目需要维护哪些 2 个用户句柄来解决这个问题(例如列表框中的每个项目需要维护 2 个用户句柄?)。这似乎很可疑。用户句柄 http://msdn.microsoft.com/en-us/library/ms725486.aspx仅适用于少数顶级 Windows UI 对象(Windows、菜单、光标、窗口位置、icons, ETC...)。我不明白为什么你的小部件需要为每个项目保留 2 个对象(它是一个图标句柄吗??)。
如果你想把整个事情拆开——这听起来像是一个人的工作虚拟模式列表视图 http://msdn.microsoft.com/en-us/library/bb774735(VS.85).aspx(LVS_OWNERDATA)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)