zoukankan      html  css  js  c++  java
  • 工作线程基类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,需要先退出工作线程。

     

  • 相关阅读:
    ZeptoLab Code Rush 2015
    UVa 10048 Audiophobia【Floyd】
    POJ 1847 Tram【Floyd】
    UVa 247 Calling Circles【传递闭包】
    UVa 1395 Slim Span【最小生成树】
    HDU 4006 The kth great number【优先队列】
    UVa 674 Coin Change【记忆化搜索】
    UVa 10285 Longest Run on a Snowboard【记忆化搜索】
    【NOIP2016提高A组模拟9.28】求导
    【NOIP2012模拟10.9】电费结算
  • 原文地址:https://www.cnblogs.com/hgwang/p/6094444.html
Copyright © 2011-2022 走看看