这篇文章 中说过Qt进程使用QTimer的静态signalShot函数会创建单次触发的定时器.创建后,该定时器没到触发时间是无法析构的.如果创建该定时器的对象析构,该定时器会泄漏到被触发为止.所以使用signalShot的话随着时间推移,积累的定时器可能会越来越多.出现莫名奇妙的错误.只有终端中会出现这个提示(如果是ui程序没终端就更懵逼了).
QEventDispatcherWin32::registerTimer: Failed to create a timer (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。
之前一直以为真的是QTimer泄漏导致句柄数量达到了上限.所以将所有的signalShot都改为可销毁的QTimer后,依然偶尔会出现这个提示.经过研究发现是被这个提示误导了.并不是句柄达到了上限,而是用户对象数量达到了上限.windows每个进程最多只能创建10000个用户对象.每个活动的QTimer要使用一个windows的timer(用户对象).当进程管理的对象需要大量定时器(超过10000 - 其他地方使用的用户对象数量)时,就会出现上述错误.并且