用QT在做一個視頻播放器,自己的解碼庫和渲染庫。基本思路是開一個子執行緒用于解碼,主執行緒渲染。我再兩個執行緒中都用了死回圈,不停解碼,不停渲染。發現CPU的占用率很高,嘗試在解碼子執行緒使用Sleep,結果本來能正常播放的視頻邊的慢速播放了。我用的是臨界區互斥的方式來協調兩個執行緒作業的。貼上子執行緒代碼
EnterCriticalSection(&gcsAcessOneFrm);
Sleep(10);
nRSize = pMainWnd->m_Framebuf.PutFrame(DECT.m_hDec, DECT.m_pInData, DECT.m_rfp);
LeaveCriticalSection(&gcsAcessOneFrm);
后來使用事件(EVENT)同步,去掉了Sleep,CPU占用率降低了一些。不知道占用率降低是不是因為事件(EVENT)同步,阻塞了執行緒,而之前的Sleep()是采用執行緒掛起的方式,雖然CPU占用率降低了很多,但是這導致解碼速度變慢了,播放變慢?
是否有合適的方法來控制兩個執行緒同步?
另外關于主執行緒,在主執行緒渲染播放的時候界面控制元件仍能控制,是否主執行緒渲染不該用死回圈不斷等待時間到了去渲染下一幀?
uj5u.com熱心網友回復:
我想了一些qt下是否有類似mfc的訊息映射機制,當下一幀的渲染時間到了子執行緒發送訊息給主執行緒渲染畫面。但這樣存在一寫問題:1.子執行緒在定時期間會阻塞在那,不能繼續解碼。2.子執行緒發送訊息主執行緒執行渲染延遲時間會不會較長且不穩定影響播放幀率。uj5u.com熱心網友回復:
沒人解答一下嗎
uj5u.com熱心網友回復:
對于占用率不言而喻的另一個引數是空閑率;不管你有沒有事情,CPU一直在奔跑,頻率不會降低。如果你的任務重了,CPU就沒有那么閑,自然占有率就增大;你的任務就很重,你還讓它Sleep,引起卡頓就不奇怪。uj5u.com熱心網友回復:
《Windows核心編程》轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62493.html
標籤:進程/線程/DLL
