wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我在QT图形场景视图中通过QGraphicsProxyWidget添加代理Widget(实现添加基本的QT Widget,如按钮、复选框、日期时间控件等),当数量超过3500左右的时候,QT应用程序直接崩溃了~ 提示: CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。) 这里我是在Windows系统上进行的实验,可见,创建WIdget的

我在QT图形场景视图中通过QGraphicsProxyWidget添加代理Widget(实现添加基本的QT Widget,如按钮、复选框、日期时间控件等),当数量超过3500左右的时候,QT应用程序直接崩溃了~

提示: CreateWindowEx Failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)

CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)

这里我是在Windows系统上进行的实验,可见,创建WIdget的时候底层还是调用的Windows API CreateWindowEx

 

QT创建Widget的时候实际上调用了Windows API CreateWindowEx,当创建的数量很多时就会造成窗口句柄不够用。
初步分析:Windows的窗口句柄是有限制的,当消耗殆尽就会出现上述的@L_772_9@提示,从而导致程序崩溃退出

 

在Windows平台上使用GetLastError 获取@L_772_9@码 1158
[1158]-当前程序已使用了 Window 管理器对象的系统允许的所有句柄。 
1158 : ERROR_NO_MORE_user_HANDLES
The current process has used all of its system allowance of handles for Window Manager objects.
意思是说你的程序已经没有可用句柄能再分配使用了,系统分配给一个进程的可用句柄数是有限的,我猜测你的程序中打开了大量句柄,但是用过之后却没有记得释放,好好检查一下代码吧,句柄不用了就要CloseHandle()释放掉,不然系统的句柄资源会被你耗光的.

比如说,hProcess := OpenProcess(...);获取一个进程句柄,当你对这个进程操作完成过后,就要CloseHandle(hProcess);
如果程序中创建很多个窗口,创建过程中会导致进程的“User Objects”数量不断增大,会超过每个进程允许的上限值(每个进程GDI句柄上限10000,用户句柄上限10000),you should avoid getTing anywhere near it as there is also a session-wide limit that is too close for comfort to the per process limit.

 

CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)

 

关于Windows句柄数限制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)


设置
GDIProcessHandleQuota项设置GDI句柄数量认值为2710(16进制)/10000(10进制),该值的允许范围为 256 ~ 16384 ,将其调整为大于认的10000的值。如果您的系统配置了2G或更多内容,不妨将其设置为允许的最大值 16384(10进制);
USERProcessHandleQuota项设置用户句柄数量认值同样为2710(16进制)/10000(10进制),该值的允许范围为 200 ~ 18000 ,将其调整为更多的数值。同样地,对于具有2GB或更多物理内存的系统,不妨将用户句柄数直接设置为上限 18000(10进制);

感觉设置了没啥作用,多出了那一点句柄数起不了什么作用。

亲自试了试,确实没啥大作用!

大佬总结

以上是大佬教程为你收集整理的CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)全部内容,希望文章能够帮你解决CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。