不占用windows用户对象的定时器

 这篇文章 中说过Qt进程使用QTimer的静态signalShot函数会创建单次触发的定时器.创建后,该定时器没到触发时间是无法析构的.如果创建该定时器的对象析构,该定时器会泄漏到被触发为止.所以使用signalShot的话随着时间推移,积累的定时器可能会越来越多.出现莫名奇妙的错误.只有终端中会出现这个提示(如果是ui程序没终端就更懵逼了).

QEventDispatcherWin32::registerTimer: Failed to create a timer (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。

之前一直以为真的是QTimer泄漏导致句柄数量达到了上限.所以将所有的signalShot都改为可销毁的QTimer后,依然偶尔会出现这个提示.经过研究发现是被这个提示误导了.并不是句柄达到了上限,而是用户对象数量达到了上限.windows每个进程最多只能创建10000个用户对象.每个活动的QTimer要使用一个windows的timer(用户对象).当进程管理的对象需要大量定时器(超过10000 - 其他地方使用的用户对象数量)时,就会出现上述错误.并且

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Windows 微妙级定时器是一种高精度的计时器,可以在微妙级别上进行计时,并在指定的时间间隔内执行相应的操作。这种定时器通常用于需要精确计时的应用程序,如音视频处理、游戏、实时数据采集等。 在 Windows 中,可以使用 QueryPerformanceCounter 和 QueryPerformanceFrequency 函数来获取当前计时器的值和计时器的分辨率。具体的步骤如下: 1. 调用 QueryPerformanceFrequency 函数获取计时器的分辨率,单位为每秒的计时周期数。 2. 调用 QueryPerformanceCounter 函数获取当前计时器的值,单位为计时周期数。 3. 根据需要计算出指定时间间隔内所需的计时周期数,然后等待计时器计数器的值达到该数值。 4. 执行相应的操作,然后重复以上步骤。 使用微妙级定时器需要注意以下几点: 1. 计时器的分辨率可能因硬件和系统配置而异,不同的计算机可能存在较大的差异。 2. 需要保证计时器的值和所需的计时周期数都是 64 位整数类型,以避免计算溢出。 3. 在等待计时器达到指定值时,可以使用 Sleep 函数或者循环等待的方式,但需要注意避免过度消耗 CPU 资源。 下面是一个示例代码,展示了如何使用微妙级定时器实现每隔 1 秒钟输出一次当前时间的操作: ``` #include <iostream> #include <Windows.h> int main() { LARGE_INTEGER freq, start, end; QueryPerformanceFrequency(&freq); while (true) { QueryPerformanceCounter(&start); // 等待 1 秒钟 while (true) { QueryPerformanceCounter(&end); if ((end.QuadPart - start.QuadPart) * 1000000 >= freq.QuadPart) { break; } // 可以使用 Sleep(1) 函数代替循环等待以避免过度消耗 CPU 资源 } // 输出当前时间 std::cout << time(nullptr) << std::endl; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值