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