我要一个程序里加入了一个WM_TIMER消息,然后用SetTimer(123,40, NULL)设定了消息产生的频率,在OnTimer(nIDEvent)里让程序每产生一个消息就播放一幅图片,实现连续播放。但发现在播放图片期间,程序不响应其他消息了,如点击按钮也不起作用了。KillTimer(123)也有。各位高手不知道这个是设么原因?

解决方案 »

  1.   

    我要一个程序里加入了一个WM_TIMER消息,然后用SetTimer(123,40, NULL)设定了消息产生的频率,在OnTimer(nIDEvent)里让程序每产生一个消息就播放一幅图片,实现连续播放。
    -----------------------------------------------------------------------------------
    这个思想是可行的(1000/40等于25,每秒钟只有25帧,机器应该可以处理的来),但估计是处理手法的问题,您可以这样做:
    OnTimer发生时把数据保存下来,然后用InvalidateRect触发窗口重画,在OnPaint中把当前保存着的图象画出来(StretchDIBits)。
      

  2.   

    我也试过用类似的方法播放视频文件,速度跟用direct draw差不多,效果很流畅,只吃百份之几的CPU资源。
      

  3.   

    1
    可能你的图片比较大或是绘制代码复杂, 导致处理时间太长,界面失去相应, 可以把绘制代码放到一线程里去做,就像1楼所说到.2
    也可以尝试优化绘制代码,放弃GDI的位图函数,因为很多场合,那些函数实在太慢了,换用DrawDibDraw等效率比较高的函数,或是直接用DirectX中。
      

  4.   

    WM_TIMER是个优先级很低的消息。根据lz的说法,可能是在WM_TIME中处理了画屏幕的功能。WM_PAINT的消息优先级要比WM_TIME高lz可以考虑用WM_PAINT消息画图,用WM_TIME消息确定画图时机和画那张图就可以了
      

  5.   

    谢谢这么多位热心的人士,可能是比较耗时吧,因为我除了要在电脑上播放图片之外还要把图片通过USB接口送到一个外设(LCD上)去显示。改了一下代码后,问题好像没那么严重了,不过好像还是存在较大的延时。
      

  6.   

    “在电脑上播放图片”这个用GDI可以在界面线程处理;
    “还要把图片通过USB接口送到一个外设(LCD上)去显示”这个没理由不开线程处理,如果是连续图片的话应该还要压缩编码后再传。