前面介紹虛擬文件系統(tǒng)的線程,其實它是單一個線程來處理所有消息的,還有類LLLFSThread也是一樣。在第二人生顯示的軟件里,圖片是占了絕大部份數(shù)據(jù),那么從服務器上下載的數(shù)據(jù),都是壓縮的圖片,這樣的圖片大小就比較小一些,對于網(wǎng)絡(luò)通訊就需要不太多帶寬了,看到程序顯示速度明顯加快。下面就來分析一下這個線程到怎么樣工作的?
LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
上面這行代碼就是創(chuàng)建圖像解碼工作線程的。
?
LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
這行代碼就設(shè)置圖像解碼工作由工作線程sImageDecodeThread來實現(xiàn),由于getImageDecodeThread函數(shù)返回的線程,就是上面的sImageDecodeThread成員。
?
從創(chuàng)建線程里也看到是類LLWorkerThread的對象,類LLWorkerThread是繼承線程類LLQueuedThread的。LLImageWorker類可以不斷把需要做的工作,放到線程sImageDecodeThread里去做,這樣就實現(xiàn)了圖像解碼。
?
#001?class LLImageWorker : public LLWorkerClass
#002?{
#003?public:
#004?
???? static void initClass(LLWorkerThread* workerthread);
#005?
???? static void cleanupClass();
#006?
???? static LLWorkerThread* getWorkerThread() { return sWorkerThread; }
#007?
#008?
???? // LLWorkerThread
#009?public:
#010?
???? LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard,
#011?
????????????????????????? ??LLPointer<LLResponder> responder);
#012?
???? ~LLImageWorker();
#013?
#014?
???? // called from WORKER THREAD, returns TRUE if done
#015?
???? /*virtual*/ bool doWork(S32 param);
#016?
????
#017?
???? BOOL requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard = -1);
#018?
???? BOOL requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard = -1);
#019?
???? void releaseDecodedData();
#020?
???? void cancelDecode();
#021?
#022?private:
#023?
???? // called from MAIN THREAD
#024?
???? /*virtual*/ void startWork(S32 param); // called from addWork()
#025?
???? /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork()
#026?
#027?protected:
#028?
???? LLPointer<LLImageFormatted> mFormattedImage;
#029?
???? LLPointer<LLImageRaw> mDecodedImage;
#030?
???? S32 mDecodedType;
#031?
???? S32 mDiscardLevel;
#032?
#033 ?private:
#034?
???? U32 mPriority;
#035?
???? LLPointer<LLResponder> mResponder;
#036?
????
#037?protected:
#038?
???? static LLWorkerThread* sWorkerThread;
#039?
#040?public:
#041?
???? static S32 sCount;
#042?};
#043?
?
在這個類里,先調(diào)用startWork函數(shù)開始線程工作,接著就不斷調(diào)用requestDecodedData、requestDecodedAuxData來發(fā)送數(shù)據(jù)給線程來解碼,然后再由線程來調(diào)用doWork來做這樣的工作,最后調(diào)用endWork來結(jié)束工作。
?
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
