zoukankan      html  css  js  c++  java
  • 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进制);

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

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

  • 相关阅读:
    终端时钟与时钟源偏差40秒异常处理
    (原创)odoo one2many字段以子列表形式显示
    (原创)odoo动态设置树形视图中的字段,每个用户可定制自己要显示的字段
    (原创)odoo14下qweb模板的前端与后端语法区别
    nginx安装前奏
    MySQL破解root用户密码
    Docker创建运行多个mysql容器
    判断pcie卡插在哪个cpu上
    虚拟化之Hypervisor
    HCIA-Cloud Computer笔记
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10782416.html
Copyright © 2011-2022 走看看