使用gdi+和之前写的 CTimerMgr 写了一个播放gif动画的小控件。原理就是使用gdi+解码gif,读出动画帧间隔,使用CTimerMgr
设置定时器。定时器超在新创建的线程中设置当前应该播放的帧(SelectActiveFrame()),并要求控件重绘(Invalidate())。
使用中发现debug下output窗口总是输出 First-chance exception at 0x4aeee2e0
0x80000001: 尚未实现,但并不影响程序运行。后来发现问题就源自于在 定时器线程中调用了 GDI+ 的Image类的
SelectActiveFrame()。应该是 Image不是线程安全的类导致的。
解决方案很简单,使用WM_Timer做定时器。其实从一开始的实现上就应该使用WM_TIMER,而不是定时器线程。当初使用定时器线程是怕UI线程中有耗时操作会导致gif卡。
但是定时器线程并不能解决这个问题,因为定时器线程仅仅是设置了应当绘制的下一帧,具体的绘制还是在UI线程中处理的。