克服Windows用户对象句柄限制

4
我正在寻找高级策略来处理构建重量级Windows界面时的用户对象句柄限制。请解释一下您如何使用SWT或直接的Windows GUI API克服或绕过此问题。唯一不感兴趣的是优化小部件使用的策略,因为我已经广泛地做了这个,它并不能解决问题,只会减少它出现的可能性。
我的情况:
我有一个基于SWT的GUI,允许在同一个父Shell中进行多个会话,并且每个会话中都有3个单独的位置显示用户生成的评论列表。随着用户打开多个会话并提取填充这些列表的数据,用户对象句柄的数量可能会大大增加,具体取决于评论的数量。
我的当前解决方案:
1. 默认情况下,我对评论进行分页,从而限制每个会话中的评论行数,但由于管理要求,我还有一个有效的“查看全部”按钮,完全绕过了这一点。
2. 我自定义绘制每行中的所有非可编辑信息。这意味着每行只使用2个对象句柄。
3. 我创建了JNI调用,查询操作系统的当前使用率和最大使用率。通过这种方式,我可以向用户指示崩溃即将发生。不用说,他们忽略了这个警告。

嘿,Spencer,你是怎么实现第三个解决方案的? - Mario Marinato
3个回答

6
首先,您确定问题不是桌面堆栈与句柄计数之间的问题吗?每个句柄可以消耗一定量的Windows桌面堆栈。一个USER句柄可能会占用很多空间,有些很少。我建议这样做是为了确保您不会在追逐用户句柄计数时追求其他东西。(google搜索Microsoft的dheapmon工具,它可能会有所帮助)
我已经阅读到您可以通过更改注册表中的键来更改句柄的最大值:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota和GDIProcessHandleQuota
这可能是用户的短期解决方案。
我会先确定每个项目需要维护哪两个用户句柄(例如列表框中的每个项目需要2个吗?)。这似乎可疑。{{link1:User handles}}仅适用于少数顶级Windows UI对象(Windows、菜单、光标、窗口位置、图标等...)。我不明白为什么您的小部件需要为每个项目保留2个对象(它是一个图标句柄吗?)。
如果您想要完全重构它 - 这听起来像是一个 虚拟模式列表视图 (LVS_OWNERDATA) 的工作。

5

我并不认为他正在创建消耗句柄的多个(1000个)窗口。听起来好像他的单个(或者是三个)窗口每次显示“项目”时会消耗2个句柄。 - Aardvark
從原始問題中很難判斷,但你可能是對的。 - 1800 INFORMATION

2
不仅顶级窗口,大多数本机控件也使用一个用户对象。有关用户和其他句柄类型的深入解释,请参见给我一个句柄,我会给你展示一个对象。这也意味着SWT每个小部件至少使用一个用户句柄,即使是复合控件。
如果您真的达到了每个进程10000个用户对象的限制,并且没有泄漏,那么您唯一的选择是减少应用程序中小部件实例的数量。我写了一篇博客文章,介绍了我们如何为我们的应用程序做到这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接