




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
今天见论坛里有问怎么样实现线程池。碰巧原来写过一个类似的。现在来说说。(下面的全是个人理解,不见得是正确的。)1。先来说说线程池。为什么要使用线程池?因为创建线程和释放线程是要消耗系统资源的,如果要完成一个工作要不停的创建和释放线程必然会造成很大的系统资源的浪费,所以用线程池。在线程本次工作完成后,不释放线程,让线程等待。再有需要让线程去完成的工作时就把原来创建的线程取过来继续使用。这样节省了重复的创建释放线程的过程。2。如何实现功能。根据上面的理解我们来实现这些工作。A.我们先要创建一个容器来装这些已经创建的线程。B.然后我们需要用一套机制来让我们知道容器中的线程哪个是空闲的。哪个正在工作。开始动手写吧./.h文件#ifndef MyThreadPoolH#define MyThreadPoolH#include /定义通讯消息#define TP_AddThread WM_USER + 1001 /向容器添加一个线程#define TP_DeleteThread WM_USER + 1002 /删除容器中的一个线程#define TP_GetFreeThread WM_USER + 1003 /获取一个空闲线程#define TP_GetThreadCount WM_USER + 1004 /得到容器中的线程总数class MyThreadPool : public TObjectprivate: HANDLE FHandle;/线程池的句柄 用来接收通讯消。 TList *FThreadList; /用一个TList来做容器 bool FError; /是否出现错误 void _fastcall (TMessage &Message);/消息处理函数 long _fastcall FGetThreadCount(void);/得到容器中线程的总数public: _fastcall MyThreadPool(); _fastcall MyThreadPool();_published: /发布属性 _property HNDLE Handle=read=FHandle; _property bool Error=read=FError; /_property TList *ThreadList=read=FThreadList;/如果有必要把容器发布出来 !但会降低安全性! _property long ThreadCount=read=GetFreeThread;#endif/.cpp#include #pragma hdrstop#include MyThreadPool.h#pragma package(smart_init)_fastcall MyThreadPool:MyThreadPool() FError=false; FHandle=AllocateHWnd(MyProc);/创建一个窗口句柄来处理消息 if(FHandle=NULL) FError=true; return; FThreadList=new TList;/创建容器 if(FThreadList=NULL) FError=true; return; _fastcall MyThreadPool:MyThreadPool() if(FHandle!=NULL)/释放句柄 DeallocateHWnd(FHandle); if(FThreadList!=NULL)/释放容器 /这里只把容器中的线程指针给删除了。 /中间的线程并没有释放。要释放需要自己添加代码 FThreadList-Clear(); delete FThreadList; /处理消息void _fastcall MyThreadPool:MyProc(TMessage &Message) void *pThread; int ret; switch(Message.Msg) case TP_AddThread:/添加线程的时候消息的WParam参数为线程指针 pThread=(void *)Message.WParam; ret=FThreadList-Add(pThread); Message.Result=ret;/返回线程指针在容器中的index return; case TP_DeleteThread:/删除线程时消息的WParam参数为线程指针 pThread=(void *)Message.WParam; ret=FThreadList-IndexOf(pThread); /如果线程指针不在容器中返回-1,成功删除返回1 if(ret=-1) Message.Result=-1; else FThreadList-Delete(ret); Message.Result=1; return; case TP_GetFreeThread:/得到一个空闲的线程,如果有空闲消息返回值为线程指针。 /一但线程给取出线程的Working属性就倍设置成true; for(int i=0;iCount;i+) pThreadFThreadList-Itemsi; if(TMyThread *)pThread)-Working=false) (TMyThread *)pThread)-Working=true; Message.Result=(long)pThread; return; Message.Result=0; return; case TP_GetThreadCount:/返回容器中的总数 Message.Result=FThreadList-Count; return; try Dispatch(&Message); if(Message.Msg=WM_QUERYENDSESSION) Message.Result=1; catch(.);3。我们还需要定制一个自己的线程类来配合上面的ThreadPool来使用class TMyThread : public TThreadprivate: bool FWorking; HANDLE PoolHandleprotected: void _fastcall Execute();public: _fastcall TMyThread(bool CreateSuspended,HANDLE hHandle/*线程池的句柄*/);_published: /发布属性 _property bool Working=read=FWorking,write=FWorking; /线程是否空闲;_fastcall TMyThread:TMyThread(bool CreateSuspended,HANDLE hHandle) : TThread(CreateSuspended) PoolHandle=hHandle; FWorking=false; void _fastcall TMyThread:Execute() while(!Terminated) FWorking=true; /工作代码 /。 FWorking=false; this-Suspend(); :SendMessage(PoolHandle,TP_DeleteThread,(long)this,0);/在线程池的容器中删除本线程 return;/线程结束4。下面来演示一下如何使用/1.创建线程池对象MyThreadPool *pMyTP=new MyThreadPool;if(!pMyTP | pMyTP-Error) /创建出错。 /。处理代码 /2.创建N个TMyThread线程对象,并加入线程池TMyThread *pThread;for(int i=0;iHandle); :SendMessage(pMyTP-Handle,TP_AddThread,(long)pThread,0); /3.从线程池中去空闲线程TMyThread *pThread;pThread=(TMyThread *):SendMessage(pMyTP-Handle,TP_GetFreeThrea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校线上教学平台应用攻略
- 剧院物业管理运营标准操作手册
- 小学科学重点题型复习与检测
- 卫生专业考研历年真题
- 企业员工职业发展与培训计划
- 高校学生学习成绩评定标准及办法
- 线上教育平台运营策略指南
- 量子比特与经典比特融合技术-洞察及研究
- 供应链物流优化管理实践方案
- 投影仪安装布线施工方案
- 招标代理服务服务方案
- 外周血细胞形态学考试试题及答案
- 幼儿园每月食品安全调度会议纪要
- 人力资源管理与开发公开课
- 食堂诺如病毒预防培训
- 人教版(2019)高中生物必修2《遗传与进化》教材课后练习题答案
- 燃料运输部推煤机和装载机检修维护费用及范围
- 第12课《身体“红绿灯”》课件
- 股份公司股权转让协议书范本(标准版)
- CH13-极限的运算课件
- 《解热镇痛药》课件
评论
0/150
提交评论