我在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_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

设置
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 管理器对象的系统允许的所有句柄。)的更多相关文章

  1. QtQuick桌面应用程序开发指南 4)动态管理Note对象_B 5)加强外观 6)许多其他的改进

    4.2.2 Stateless(不管状态)JavaScript库 为了让开发轻松点, 使用一个JavaScript接口来和数据库交互是个好主意, 它在QML中提供了方便的方法; 在QtCreator中 ...

  2. 编写Java程序,使用Swing布局管理器和常用控件,实现仿QQ登录界面

    返回本章节 返回作业目录 需求说明: 使用Swing布局管理器和常用控件,实现仿QQ登录界面 实现思路: 创建登录界面的类QQLogin,该类继承父类JFrame,在该类中创建无参数的构造方法,在构造 ...

  3. 编写Java程序,使用Swing布局管理器与常用控件,实现用户登录界面

    返回本章节 返回作业目录 需求说明: 使用Swing布局管理器与常用控件,实现用户登录界面 实现思路: 创建用户登录界面的类LoginFrame,在该类中创建无参数的构造方法,在构造方法中,设置窗体大 ...

  4. Android应用程序窗口(Activity)的窗口对象(Window) 的创建过程分析

    每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口. 每一个Activity组件都有一个关联的ContextImp ...

  5. Mac软件安装提示程序已损坏解决方案

    ---恢复内容开始--- 最近下载好的Mac软件安装时,系统跳出该程序已损坏: 嗯……估计是因为下载了破解版,被系统屏蔽,重设一下安全设置就好: 很兴奋的打开系统偏好设置->安全性与隐私: 然而 ...

  6. OpenCV 无法启动此程序,因为计算机中丢失opencv_core249.dll。请尝试重新安装改程序已解决此问题

    换了64位的系统,配置好之后运行之前的程序,竟然给我抛出这个错误.应该是我的opencv没有安装对吧.系统报错 无法启动此程序,因为计算机中丢失opencv_core249.dll.请尝试重新安装改程 ...

  7. 解决 无法启动此程序,因为计算机中丢失opencv_world341.dll。请尝试重新安装改程序已解决此问题

    在运行OpenCV程序时报错:“无法启动此程序,因为计算机中丢失opencv_world341.dll.请尝试重新安装改程序已解决此问题”. 解决方法 我的bin目录是 D:\opencv\build ...

  8. 关闭”xx程序已停止工作”提示窗口

    运行注册表编辑器,依次定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\WindowsError Reporting,在右侧窗口中找到并双击打开Donts ...

  9. VMware 打开虚拟机出现另一个程序已锁定文件的一部分,进程无法访问

    打开虚拟机出现 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘"D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位.vmdk"或 ...

随机推荐

  1. C++程序设计方法6:算法横向拆分

    例子1:负载监视器,如何在一个程序中实现对这些不同条件的适应呢? int main() { WindowDisplay display; Monitor monitor(&display); ...

  2. JS面向对象之创建对象模式

    虽然Object构造函数或对象字面量都可以用来创建单个对象,但都有一个缺点,使用同一个接口来创建对象,会产生大量重复的代码,为解决这个问题,引出下列方法 1.工厂模式 抽象了创建具体对象的过程,用函数 ...

  3. list-循环小练习(作业已交未交)

    报错 list index out of range : 超出下标   这个错误是因为在写stus列表的时候写成了如下stus=['小花,未交'] ,但是取下标的时候取的是stus[1]:实际该列表中 ...

  4. Vue(十三)自定义指令

    自定义指令 分类:全局指令.局部指令 1. 自定义全局指令 使用全局方法Vue.directive(指令ID,定义对象) 2. 自定义局部指令   <!DOCTYPE html> < ...

  5. 【容斥】Four-tuples @山东省第九届省赛 F

    时间限制: 10 Sec 内存限制: 128 MB 题目描述 Given l1,r1,l2,r2,l3,r3,l4,r4, please count the number of four-tuples ...

  6. Windows软件

    安装地址:C:\Users\Username\AppData\Local\Programs 网页 Chrome 下载地址:https://www.google.cn/chrome/thank-you. ...

  7. Deepin 15.4 安装 Double Commander

    参照官方教程,安装命令行如下: https://software.opensuse.org/download.html?project=home%3AAlexx2000&package=dou ...

  8. mysql 创建用户命令-grant

    我们在使用mysql的过程中,经常需要对用户授权(添加,修改,删除),在mysql当中有三种方式实现 分别是 INSERT USER表的方法.CREATE USER的方法.GRANT的方法.今天主要看 ...

  9. 04、常用RDD操作整理

    常用Transformation 注:某些函数只有PairRDD只有,而普通的RDD则没有,比如gropuByKey.reduceByKey.sortByKey.join.cogroup等函数要根据K ...

  10. Redis简单示例

    1.Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 从2010年3月15日起,Redis的开发工作由VMwa ...