克服Windows用户对象句柄限制

时间:2020-03-06 15:03:09  来源:igfitidea点击:

我正在寻找在构建重量级Windows界面时处理User Object Handle限制的高级策略。请说明我们如何使用SWT或者直接Windows GUI API克服或者绕过此问题。我唯一不感兴趣的是优化小部件使用的策略,因为我已经做了很多工作,但这并不能解决问题,只会降低它的可能性。

我的情况:
我有一个基于SWT的GUI,该GUI允许在同一父外壳程序中进行多个会话,并且在每个会话中,它们是3个单独的位置,其中显示了用户生成的注释列表。当用户打开多个会话并提取填充这些列表的数据时,取决于注释的数量,用户对象句柄的数量会急剧增加。

我当前的解决方案:
1.默认情况下,我分页注释,从而限制了每个会话中注释行的数量,但是由于管理要求,我还有一个有效的"全部查看"按钮,可以完全绕开此按钮。
2.我自定义在每一行中绘制所有不可编辑的信息。这意味着每一行仅利用2个对象句柄。
3.我创建了JNI调用,用于查询操作系统的当前使用情况和最大使用情况。这样,我可以向用户指示即将发生崩溃。不用说,他们忽略了这个警告。

解决方案

我们应该考虑使用无窗口控件。它们正是针对这种情况而设计的。参见Raymond Chen的"无窗口控件不是魔术"

首先,我们确定问题不是桌面堆还是句柄计数?每个句柄可以消耗一定数量的Windows桌面堆。一个USER句柄可能会占用很多空间,有些则很少。我建议这样做,以确保在其他情况下,我们不会追逐用户句柄计数。 (对于Microsoft的dheapmon工具,使用google可能会有所帮助)

我读过我们可以通过更改注册表中的键来更改句柄的最大值:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT
CurrentVersion \ Windows \ USERProcessHandleQuota和GDIProcessHandleQuota

对于用户来说,这可能是一个短期修复。

首先,我要弄清楚需要为每个项目维护2个用户句柄(例如在列表框中为每个项目维护2个)。这似乎令人怀疑。用户句柄仅适用于一些顶级Windows UI对象(Windows,菜单,光标,窗口位置,图标等)。我不明白为什么小部件需要为每个项目保留2个对象(它是图标句柄吗?)。

如果我们希望将所有内容拆开,这听起来像是虚拟模式列表视图(LVS_OWNERDATA)的工作。