我正在寻找在构建重量级Windows界面时处理用户对象句柄限制的高级策略。请解释您如何使用SWT或直接Windows GUI API克服或绕过此问题。我唯一不感兴趣的是优化小部件使用的策略,因为我已经广泛地做了这个并且它没有解决问题,只是使它不太可能。
我的情况:
我有一个基于SWT的GUI,允许在同一个父shell中进行多个会话,并且在每个会话中,它们是3个单独的位置,其中显示用户生成的注释列表。当用户打开多个会话并提取填充这些列表的数据时,用户对象句柄的数量会根据注释的数量而显着增加。
我目前的解决方案:
1.我默认页面注释,从而限制每个会话中的注释行数,但由于管理要求,我还有一个实际上是“全部查看”按钮,完全绕过它。
我自定义在每一行中绘制所有不可编辑的信息。这意味着每行仅使用2个对象句柄
3.我创建了JNI调用,查询操作系统的当前使用情况和最大使用率。有了这个,我可以告诉用户即将发生崩溃。不用说,他们忽略了这个警告。
答案 0 :(得分:6)
首先,您确定问题不是桌面堆与句柄计数吗?每个句柄都可以占用一定量的Windows桌面堆。一个USER手柄可能会占用很多空间,有些空间很小。我建议这样做,以确保你没有追逐用户句柄计数,当它真的是别的东西。 (谷歌为微软的dheapmon工具,它可能会有所帮助)
我已经读过你可以通过更改注册表中的键来改变句柄的最大值:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota 和 GDIProcessHandleQuota
这可能是用户的短期修复。
我首先要弄清楚每个项目需要维护2个用户句柄(对于列表框中的每个项目都需要2个)?这似乎是可疑的。 User handles仅适用于少数顶级Windows UI对象(Windows,菜单,游标,窗口位置, 图标 等等)。我不明白为什么你的小部件需要为每个项目保留2个对象(它是一个图标句柄吗?)。
如果你想把整个事情分开 - 这听起来像是virtual-mode List-View(LVS_OWNERDATA)的工作。
答案 1 :(得分:5)
您应该考虑使用无窗口控件。它们专为这种情况而设计。见Raymond Chen的"Windowless controls are not magic"
答案 2 :(得分:2)
不仅是顶级窗口,而且大多数本机控件都使用一个用户对象。有关用户和其他句柄类型的深入说明,请参阅Give Me a Handle, and I'll Show You an Object。这也意味着SWT每个小部件至少使用一个用户句柄,即使对于Composite也是如此。
如果您确实每个进程达到10000个用户对象的限制,并且没有泄漏,那么您唯一的选择是减少应用程序中的窗口小部件实例的数量。我写了blog article关于我们如何为我们的申请做这件事。