工作线程基类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,需要先退出工作线程。

 

 

 

 

posted on 2016-11-23 17:19  炽离  阅读(932)  评论(0编辑  收藏  举报

导航