关于定时器的编程的问题

deltforce 2004-11-08 12:54:20
我需要建立多个定时器来设定不同的时间间隔;
SetTimer(1,1000,NULL);
SetTimer(2,100,NULL);
在不同的时间到达时作不同的事,代码如下:
void CTimerproView::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)TRACE("1000 Time over!\n");
if(nIDEvent==2)TRACE("100 Time over!\n");
CView::OnTimer(nIDEvent);
}
结果发现,"100 Time over!“输出的9次,后"100 Time over”输出1次,那么第10次的,"100 Time over!“被忽略了,那么就存在,不同的时间周期,当经过多个周期后多个定时器可能发送消息的重合的情况,并且部分处理被忽略,的我不想忽略这个时间段怎么解决?
...全文
279 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
commandconque 2004-11-17
  • 打赏
  • 举报
回复
时间消息在消息消息队列中是不会连续的,否则系统要花费的开销太大了,系统的时间消息太多了。这就如楼上所说一样。要处理这个问题可以在SetTimer()中的设置第三参数就是设置定时器的对应的处理函数。将代码改为如下:
void CALLBACK time1(HWND hwnd,UINT nMsg,UINT nTimer,DWORD dwTime)
{
TRACE(1000 Time over!\n");
return ;
}
void CALLBACK time2(HWND hwnd,UINT nMsg,UINT nTimer,DWORD dwTime)
{
TRACE("100 Time over!\n");
return ;
}
....

SetTimer(1,1000,time1);
SetTimer(2,100,time1);
deltforce 2004-11-17
  • 打赏
  • 举报
回复
ding
deltforce 2004-11-10
  • 打赏
  • 举报
回复
请问楼上如何解决这个问题??
oyljerry 2004-11-09
  • 打赏
  • 举报
回复
如果消息队列中有一个没有处理的 WM_TIMER 消息,新的就不会保存到消息队列中去,除非这个已经处理结束了!
WM_TIMER是一个优先级非常低的消息(一般是处于最低的),系统在有别的消息处理的时候是不会先处理WM_TIMER消息的;另外,WM_TIMER是有限资源,每个进程只给一个,所以,当有多个WM_TIMER消息排进队列时,系统会自动把它们合成一个WM_TIMER消息,这样,就失去了“定时器”的意义。
WM_TIMER精度大约为55ms,用来做简单的动画效果倒够用,但稍微高一点要求的就难了
superhandsome 2004-11-09
  • 打赏
  • 举报
回复
时隙没处理好
DentistryDoctor 2004-11-08
  • 打赏
  • 举报
回复
不是因为这个原因,而是因为定时器本身不够精确的原因。
deltforce 2004-11-08
  • 打赏
  • 举报
回复
可以肯定不是精确度的问题,而是当两个定时常数的公倍数时刻到达后,实际上只处理了一个消息。令一个消息被忽略了,但如果都取公倍数的方法,那要是更多个个定时器,那程序变得非常复杂。要考虑两两组合的公倍数,大家有没有其他的办法??
leky2000 2004-11-08
  • 打赏
  • 举报
回复
这个是个问题,但如果已经肯定了,事件1发生了,事件2就一定发生,这样就好办了,但是如果不太确定,就取两个定时常数的公倍数,累计一下吧,这是个笨方法。
等高手指点更好的方法吧。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧