第二人生的源码分析(四十五)图像解压线程
2008-04-25 22:09
561 查看
前面介绍虚拟文件系统的线程,其实它是单一个线程来处理所有消息的,还有类LLLFSThread也是一样。在第二人生显示的软件里,图片是占了绝大部份数据,那么从服务器上下载的数据,都是压缩的图片,这样的图片大小就比较小一些,对于网络通讯就需要不太多带宽了,看到程序显示速度明显加快。下面就来分析一下这个线程到怎么样工作的?
LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
上面这行代码就是创建图像解码工作线程的。
LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
这行代码就设置图像解码工作由工作线程sImageDecodeThread来实现,由于getImageDecodeThread函数返回的线程,就是上面的sImageDecodeThread成员。
从创建线程里也看到是类LLWorkerThread的对象,类LLWorkerThread是继承线程类LLQueuedThread的。LLImageWorker类可以不断把需要做的工作,放到线程sImageDecodeThread里去做,这样就实现了图像解码。
#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
在这个类里,先调用startWork函数开始线程工作,接着就不断调用requestDecodedData、requestDecodedAuxData来发送数据给线程来解码,然后再由线程来调用doWork来做这样的工作,最后调用endWork来结束工作。
LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
上面这行代码就是创建图像解码工作线程的。
LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
这行代码就设置图像解码工作由工作线程sImageDecodeThread来实现,由于getImageDecodeThread函数返回的线程,就是上面的sImageDecodeThread成员。
从创建线程里也看到是类LLWorkerThread的对象,类LLWorkerThread是继承线程类LLQueuedThread的。LLImageWorker类可以不断把需要做的工作,放到线程sImageDecodeThread里去做,这样就实现了图像解码。
#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
在这个类里,先调用startWork函数开始线程工作,接着就不断调用requestDecodedData、requestDecodedAuxData来发送数据给线程来解码,然后再由线程来调用doWork来做这样的工作,最后调用endWork来结束工作。
相关文章推荐
- 第二人生的源码分析(四十五)图像解压线程
- 蔡军生先生第二人生的源码分析(四十五)图像解压线程
- 第二人生的源码分析(四十五)图像解压线程
- 第二人生的源码分析(四十一)使用Apache运行库线程
- 第二人生的源码分析(四十)创建多个工作线程
- 第二人生的源码分析(四十)创建多个工作线程
- 蔡军生先生第二人生的源码分析(四十六)获取纹理图片的线程
- 第二人生的源码分析(四十)创建多个工作线程
- 蔡军生先生第二人生的源码分析(四十)创建多个工作线程
- 第二人生的源码分析(四十二)实现消息处理的线程类
- 第二人生的源码分析(四十二)实现消息处理的线程类
- 第二人生的源码分析(四十一)使用Apache运行库线程
- 第二人生的源码分析(四十二)实现消息处理的线程类
- 第二人生的源码分析(四十三)虚拟文件系统线程
- 第二人生的源码分析(四十一)使用Apache运行库线程
- 第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
- 第二人生的源码分析(三十一)接收数据的流量控制
- 第二人生的源码分析(三十二)消息解包的实现
- 第二人生的源码分析(三十五)分析消息模板文件
- 第二人生的源码分析(三十九)关闭WinXP的错误报告功能