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


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

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

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

    在Linux(Ubuntu)上进行测试,没有发现限制问题。

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

    在Windows平台上使用GetLastError 获取错误码 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.

     

    关于Windows句柄数限制
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindows


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

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

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

  • 相关阅读:
    012_py之证书过期监测及域名使用的py列表的并集差集交集
    一些java的书籍
    java之内的工具分享,附带下载链接,方便以后自己寻找
    javascript的 == 与 === 的区别
    论httpclient上传带参数【commons-httpclient和apache httpclient区别】
    java操作小技巧,遇到过的会一直更新,方便查找
    常用jsp include用法,三种include的区别
    mybatis中的#和$的区别
    单例模式
    jQuery获取Select选择的Text和 Value(转)用时比较方便寻找
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10782416.html
Copyright © 2020-2023  润新知