QTimer掉坑出坑过程
2018-06-17 21:02:07来源:未知 阅读 ()
最近遇到一个问题,就是关于QTimer设置了10ms,结果不生效,很头疼啊,查了快一天了,终于知道为什么了?
先说下QTimer的使用方法:
m_delayHideTimer这是QTimer的对象。
connect(&m_delayHideTimer, SIGNAL(timeout()), this, SLOT(slotHideMenu())); //时间耗尽就会响应后面的回调函数。
m_delayHideTimer.setInterval(100) //重新设置定时器的时间。
m_delayHideTimer.stop(); //停掉定时器
m_delayHideTimer.start(50);//开始定时器
其他的用法,查看QT asssistant就知道了不多啰嗦 上重点:
为什么10ms的精度不生效:
这里说下QT的源码,里面关于定时器的实现:
在QT的qeventdispatcher_win.cpp 文件里,有个函数具体如下:
void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
{
Q_ASSERT(internalHwnd);
Q_Q(QEventDispatcherWin32);
int ok = 0;
calculateNextTimeout(t, qt_msectime());
uint interval = t->interval;
if (interval == 0u) {
// optimization for single-shot-zero-timer
QCoreApplication::postEvent(q, new QZeroTimerEvent(t->timerId));
ok = 1;
} else if ((interval < 20u || t->timerType == Qt::PreciseTimer) && qtimeSetEvent) {
ok = t->fastTimerId = qtimeSetEvent(interval, 1, qt_fast_timer_proc, (DWORD_PTR)t,
TIME_CALLBACK_FUNCTION | TIME_PERIODIC | TIME_KILL_SYNCHRONOUS);
}
if (ok == 0) {
// user normal timers for (Very)CoarseTimers, or if no more multimedia timers available
ok = SetTimer(internalHwnd, t->timerId, interval, 0);
}
if (ok == 0)
qErrnoWarning("QEventDispatcherWin32::registerTimer: Failed to create a timer");
}
源码可知,做了几件事情:如果定时器的精度小于20ms,就会进入 qtimeSetEvent 这个函数,否则去走winapi 中的SetTimer,这个不多说。
qtimeSetEvent 这个函数的实现是:
qtimeSetEvent = (ptimeSetEvent)QSystemLibrary::resolve(QLatin1String("winmm"), "timeSetEvent");
qtimeKillEvent = (ptimeKillEvent)QSystemLibrary::resolve(QLatin1String("winmm"), "timeKillEvent");
winmm是windows的多媒体应用程序的接口,是个动态库。去响应windows是的多媒体定时器。
这个定时器如果在精度不是特别高的情况下不要随便的使用,因为win会给这个顶定时器单独分配一个线程,调用几次timeSetEvent,就需要调用几次timeKillEvent ,相对应的ID也要相同。
查了中外的各种论坛,有说同一个线程不能超过16个 也有说同一个进程不能超过16个 总之 超过16个就不生效的肯定是存在的,这里还是尽量不要写精度小于20Ms的定时器,以防万一。后续有
这个方面的研究,再更新 先去改bug了。。。
后续验证: 多媒体定时器一个进程只能开16个!所以这个高精度的定时器还是要慎用!!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:实验1
- visual studio2010编译过程中出现COFF文件损坏的原因和方法 2020-02-01
- #《Essential C++》读书笔记# 第二章 面向过程的编程风格 2020-01-31
- Qt事件分发机制源码分析之QApplication对象构建过程 2019-12-08
- Struct结构体 2019-11-07
- Qt最新版5.12.2在Win10环境静态编译安装和部署的完整过程(VS 2019-08-29
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash