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

     

  • 相关阅读:
    JavaScript进行表单提交
    《构建之法》读书笔记2
    一个简单的session传值学习
    javascript相关正则收集
    LINQ中join语法大探究(多表关联),也有不少疑问
    c#排序算法详细探究
    js获得文本框中光标的位置
    linq to sql基本的操作(读,添加,删除,更新)
    不用保存直接读取文件内容
    终于搞明白ajax拉
  • 原文地址:https://www.cnblogs.com/hgwang/p/6094444.html
Copyright © 2011-2022 走看看