void CFDlg::OnTimer (UINT_PTR nIDEvent){ // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nIDEvent == 10) { fout<<clock ()<<endl; CClientDC DC (this); DC.TextOutW (5, 5, _T ("我爱学习, 学习使我快乐!")); static int counter = 0, cy = 1; int i, j; if (abs(m_k)>100) { i = m_x+m_cx; if ((counter++)%(abs(m_k)-100) == abs (m_k)-101) { j = m_y+cy; } else j = m_y; } else { i = m_x+m_cx; j = m_y+m_cx*m_k; } m_x = i; m_y = j; SetWindowPos (NULL, i, j, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOREDRAW); if (i <=0 || i>=1600-TextSize.cx) { m_k = -m_k; m_cx = -m_cx; } if (j<=0 || j>=900-TextSize.cy) { m_k = -m_k; cy = -cy; } } CDialogEx::OnTimer (nIDEvent);}这是timer的响应函数代码. 整体功能是把窗口像浮动广告一样在窗口来回弹动. 请问timer计时不准是mfc的问题还是什么原因造成的?是所有的都不准还是因为响应代码太长?
这是我这边的测试效果,红色的是设置50ms,绿色的是100ms
WIN32接口SetTimer用起来简单,但本身精度就不是很高,它类似于Sleep,在多任务操作系统中的优先级很低,不能得到及时响应,只能用于要求不高的延时程序中。在时间跨度越大的情况下才越有利。
如果你对精度要求非常高的话,推荐使用下面的方式:
在自己的专用线程中获取当前时间,timeGetTime是个不错的选择,微软公司在其多媒体Windows中提供了精确定时器的底层API支持,利用多媒体定时器timeGetTime可以很精确地读出系统的当前时间。相比于GetTickCount来说,同样是返回的ms级的当前时钟(计算机启动后经历的时间间隔),但是精度要比WM_TIMER消息映射高,不过使用之前必须将 Winmm.lib 和 Mmsystem.h 添加到工程中。
如果需要更高的精度控制,QueryPerformanceFrequency和QueryPerformanceCounter就能派上用场了。这两个函数是Windows提供的仅供Windows 95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。其定时误差不超过1微秒,精度与CPU等机器配置有关。
一般精度越高的,占用的系统资源相对就越高,所以如果不是严格要求精度的场合,一般的定时器就够用了。
MFC中定时器的准确性问题, 我设置每50ms运行一次, 但是用clock计时竟...
在自己的专用线程中获取当前时间,timeGetTime是个不错的选择,微软公司在其多媒体Windows中提供了精确定时器的底层API支持,利用多媒体定时器timeGetTime可以很精确地读出系统的当前时间。相比于GetTickCount来说,同样是返回的ms级的当前时钟(计算机启动后经历的时间间隔),但是精度要比WM_TIMER消息映射高...
vcmfc定时器
2:MFC下的timer事件 使用:1.调用函数SetTimer()设置定时间隔,如SetTimer(0,100,NULL)即为设置100毫秒的时间间隔;2.在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。 原理:同sleep函数一样。不同的是timer是一个定时器,可以指定回调函数,...