工作线程基类TaskSvc
工作线程基类TaskSvc
前端时间用ACE写代码,发ACE_Task确实好用。不但能提供数量一定的线程,还能够让这些继承的线程函数自由访问子类的private和protected变量。此外,ACE_Task还提供了ACE_Message_Block的消息块及消息队列,能够自主定义消息,实现数据的异步处理,甚至能在运算有压力的情况下丢弃部分数据。优点虽然多多,但缺点也是有的。为了使用ACE_Task,必须得把ACE库加载起来吧。很多时候,只想用ACE_Task,每次都加载ACE库似乎就变得很讨厌了。
由此,觉得自己写一个类似ACE_Task的基类。由于线程用的比较多,这次就先写一个线程基类CTaskSvc。上代码
TaskSvc.h
1 #pragma once 2 3 #ifndef WHG_CTASKSVC 4 #define WHG_CTASKSVC 5 6 class CTaskSvc 7 { 8 public: 9 //Activate用于激活一定数量的工作者线程,默认激活数量为1。返回当前线程队列大小 10 UINT Activate(int num = 1); 11 //获取线程队列大小 12 UINT GetThreadsNum(void); 13 14 protected: 15 //只有子类才可以构造父类,拒绝外部访问构造类实例 16 CTaskSvc(void); 17 ~CTaskSvc(void); 18 //子类应重定义工作线程细节 19 virtual void svc(); 20 //Close用于等待线程结束并关闭线程,退出线程由子类控制 21 void Close(); 22 23 private: 24 //工作者线程访问接口 25 static UINT WorkThread(LPVOID param); 26 //线程队列 27 std::vector<CWinThread*> vec_threads; 28 }; 29 30 #endif
TaskSvc.cpp
1 #include "StdAfx.h" 2 #include "TaskSvc.h" 3 4 CTaskSvc::CTaskSvc(void) 5 { 6 } 7 8 CTaskSvc::~CTaskSvc(void) 9 { 10 Close(); 11 } 12 13 UINT CTaskSvc::Activate(int num) 14 { 15 for (int i=0;i<num;i++) 16 { 17 CWinThread* pwt = AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); 18 if (pwt) 19 { 20 pwt->m_bAutoDelete = false; 21 pwt->ResumeThread(); 22 vec_threads.push_back(pwt); 23 } 24 } 25 return vec_threads.size(); 26 } 27 28 UINT CTaskSvc::GetThreadsNum(void) 29 { 30 return vec_threads.size(); 31 } 32 33 34 UINT CTaskSvc::WorkThread(LPVOID param) 35 { 36 CTaskSvc* pts = (CTaskSvc*)param; 37 if (pts) 38 { 39 pts->svc(); 40 } 41 return 0; 42 } 43 44 void CTaskSvc::svc() 45 { 46 } 47 48 void CTaskSvc::Close() 49 { 50 int cnt = vec_threads.size(); 51 if (cnt > 0) 52 { 53 std::vector<CWinThread*>::iterator iter = vec_threads.begin(); 54 for (; iter != vec_threads.end(); iter++) 55 { 56 CWinThread* pwt = *iter; 57 WaitForSingleObject(pwt->m_hThread,INFINITE); 58 delete pwt; 59 } 60 vec_threads.clear(); 61 } 62 }
调用方法:
1:继承CTaskSvc类
2:添加Svc虚函数
3:在svc内添加线程工作代码
4:释放线程调用Close,需要先退出工作线程。