第一次提问,高手们多多指教!
我在做关于图片全屏显示的控制,要求是按时显示,定时器我用的是OnTimer,由于控制的需要,我用了多个定时器,启动第一个,时间到后,关闭第一个,显示图片,再进行相关的动作,再开启第二个定时器,如此循环。显示图片时我参阅了网上关于双缓存的方法,但不是GDI(+),直接用BitBlt,运行过程中,发现有时候图片显示比如设定5s,就是5s,有时候则会一闪而过,时间不到1s!过下就会正常!我用GetTickCount记录下每次定时从显示图片开始,到更换另一张图片之间的时间差,当问题发生时,我停止程序,发现记录正确,似乎不是定时器的问题!
希望高手们帮忙看看,感觉特奇怪!

解决方案 »

  1.   

    为何要不停的停止定时器开启定时器?OnTimer本身就是利用消息WM_TIMER来进行,而且优先级最低,不是很准,会有时间差。
    在加上这样不停的停止、启动,更加不准了。
      

  2.   

    OnTimer本身就是不准,再一个如果OnTimer中处理的过程如果比定时期时间长的话就会出现很多问题,因为时钟时间一到就会向消息队列中发送一个WM_TIME消息,这样会使这个消息积累的越来越多。你可以创建一个线程,在线程里用GetTickCount来计时,这样会比较准确。
      

  3.   

    timer本身就不是很准,而且受到其他执行任务的影响,建议使用线程,开启精确定时函数
      

  4.   

    OnTimer本身就不准,在早期的Windows系统中,WM_TIMER是每秒响应18.2次,新的Windows(WindowsNT中)系统中OnTimer有改进,精度与系统有关系;同时通过消息机制响应本身有增加了误差;
    精确定时推荐使用多媒体定时器:具体函数是timeSetEvent
    The timeSetEvent function starts a specified timer event. The multimedia timer runs in its own thread. After the event is activated, it calls the specified callback function or sets or pulses the specified event object.MMRESULT timeSetEvent(
      UINT           uDelay,      
      UINT           uResolution, 
      LPTIMECALLBACK lpTimeProc,  
      DWORD_PTR      dwUser,      
      UINT           fuEvent      
    );
    注意尽量以回调函数的方式处理;如果要求再苛刻些,可以考虑自己定义Thread,通过监视系统时钟的方式定时,只是这样系统资源,尤其CPU资源浪费严重;
      

  5.   

    哦,忘了补充一下,定时器不需要时必须使用timeKillEvent(hSysTimer);杀死定时器
      

  6.   

    谢谢各位大牛!
    首先对于liyinlei的提问,这里只能用控制需要,中间需要不同的时间来进行控制,确实比较麻烦!
    各位说的都很对,对于屏幕闪烁的问题,我确实很苦恼!我一再试验,发现总是到做到大约20分钟时就会出现,定时不准的情况,就像机器反应不过来,几张图片一闪而过后,就又会恢复正常!本人是小菜鸟,刚学不久,线程啊,看了很多东西,也一直不敢下手,有问题再向各位请教!
    特别感谢tomsoft,说得很详细,而我的分也不多,让你还如此费心!不胜感激!