使用gdi+和之前寫(xiě)的 CTimerMgr 寫(xiě)了一個(gè)播放gif動(dòng)畫(huà)的小控件。原理就是使用gdi+解碼gif,讀出動(dòng)畫(huà)幀間隔,使用CTimerMgr
設(shè)置定時(shí)器。定時(shí)器超在新創(chuàng)建的線程中設(shè)置當(dāng)前應(yīng)該播放的幀(SelectActiveFrame()),并要求控件重繪(Invalidate())。
使用中發(fā)現(xiàn)debug下output窗口總是輸出 First-chance exception at 0x4aeee2e0
0x80000001: 尚未實(shí)現(xiàn),但并不影響程序運(yùn)行。后來(lái)發(fā)現(xiàn)問(wèn)題就源自于在 定時(shí)器線程中調(diào)用了 GDI+ 的Image類(lèi)的
SelectActiveFrame()。應(yīng)該是 Image不是線程安全的類(lèi)導(dǎo)致的。
解決方案很簡(jiǎn)單,使用WM_Timer做定時(shí)器。其實(shí)從一開(kāi)始的實(shí)現(xiàn)上就應(yīng)該使用WM_TIMER,而不是定時(shí)器線程。當(dāng)初使用定時(shí)器線程是怕UI線程中有耗時(shí)操作會(huì)導(dǎo)致gif卡。
但是定時(shí)器線程并不能解決這個(gè)問(wèn)題,因?yàn)槎〞r(shí)器線程僅僅是設(shè)置了應(yīng)當(dāng)繪制的下一幀,具體的繪制還是在UI線程中處理的。