工作线程基类TaskSvc

  前端时间用ACE写代码,发ACE_Task确实好用。不但能提供数量一定的线程,还能够让这些继承的线程函数自由访问子类的private和protected变量。此外,ACE_Task还提供了ACE_Message_Block的消息块及消息队列,能够自主定义消息,实现数据的异步处理,甚至能在运算有压力的情况下丢弃部分数据。优点虽然多多,但缺点也是有的。为了使用ACE_Task,必须得把ACE库加载起来吧。很多时候,只想用ACE_Task,每次都加载ACE库似乎就变得很讨厌了。

  由此,觉得自己写一个类似ACE_Task的基类。由于线程用的比较多,这次就先写一个线程基类CTaskSvc。上代码

  TaskSvc.h

 #pragma once

 #ifndef WHG_CTASKSVC
#define WHG_CTASKSVC class CTaskSvc
{
public:
//Activate用于激活一定数量的工作者线程,默认激活数量为1。返回当前线程队列大小
UINT Activate(int num = );
//获取线程队列大小
UINT GetThreadsNum(void); protected:
//只有子类才可以构造父类,拒绝外部访问构造类实例
CTaskSvc(void);
~CTaskSvc(void);
//子类应重定义工作线程细节
virtual void svc();
//Close用于等待线程结束并关闭线程,退出线程由子类控制
void Close(); private:
//工作者线程访问接口
static UINT WorkThread(LPVOID param);
//线程队列
std::vector<CWinThread*> vec_threads;
}; #endif

  TaskSvc.cpp

 #include "StdAfx.h"
#include "TaskSvc.h" CTaskSvc::CTaskSvc(void)
{
} CTaskSvc::~CTaskSvc(void)
{
Close();
} UINT CTaskSvc::Activate(int num)
{
for (int i=;i<num;i++)
{
CWinThread* pwt = AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL,,CREATE_SUSPENDED);
if (pwt)
{
pwt->m_bAutoDelete = false;
pwt->ResumeThread();
vec_threads.push_back(pwt);
}
}
return vec_threads.size();
} UINT CTaskSvc::GetThreadsNum(void)
{
return vec_threads.size();
} UINT CTaskSvc::WorkThread(LPVOID param)
{
CTaskSvc* pts = (CTaskSvc*)param;
if (pts)
{
pts->svc();
}
return ;
} void CTaskSvc::svc()
{
} void CTaskSvc::Close()
{
int cnt = vec_threads.size();
if (cnt > )
{
std::vector<CWinThread*>::iterator iter = vec_threads.begin();
for (; iter != vec_threads.end(); iter++)
{
CWinThread* pwt = *iter;
WaitForSingleObject(pwt->m_hThread,INFINITE);
delete pwt;
}
vec_threads.clear();
}
}

  调用方法:

1:继承CTaskSvc类

2:添加Svc虚函数

3:在svc内添加线程工作代码

4:释放线程调用Close,需要先退出工作线程。

工作线程基类TaskSvc的更多相关文章

  1. C#WinForm线程基类

    在CS模式开发中一般我们需要用到大量的线程来处理比较耗时的操作,以防止界面假死带来不好的体验效果,下面我将我定义的线程基类给大家参考下,如有问题欢迎指正. 基类代码 #region 方法有返回值 // ...

  2. 衔接UI线程和管理后台工作线程的类(多线程、异步调用)

    一个不错的UI多线程操作类 http://www.cnblogs.com/net66/archive/2005/08/03/206132.html

  3. 编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议23.避免将List<T>作为自定义集合类的基 ...

  4. c#通用多线程基类,以队列形式

    c#通用多线程基类,以队列形式 个人原创.欢迎转载.转载请注明出处.http://www.cnblogs.com/zetee/p/3487084.html 多线程这个概念大家都很熟悉,对于winfor ...

  5. IntentService 服务 工作线程 stopself MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. linux通过c++实现线程池类

    目录 线程池的实现 线程池已基于C++11重写 : 基于C++11实现线程池的工作原理 前言 线程池的概念 使用原因及适用场合 线程池的实现原理 程序测试 线程池的实现 线程池已基于C++11重写 : ...

  7. 线程 ManualResetEvent 类

    Reset(): 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时, 它调用 Reset 以将 ManualResetEvent 置于非终止状态.此线程可被视为控制 ManualRese ...

  8. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  9. 基类子类在Qt信号量机制下的思考

    背景知识: 基类 superClass class superClass { public: superClass() { std::string m = "superClass() &qu ...

随机推荐

  1. TypeScript 学习一 参数,函数,析构表达式

    1,TypeScript是由谷歌开发的,并且新出的Angular2框架就是谷歌公司由TypeScript语言编写的,所以现在TypeScript是有微软和谷歌一起支持的: 2,TypeScript在j ...

  2. 【卷二】网络二—TCP服务器与客户端

    经过上回简单地介绍,大家对服务器多少应该清楚一些了吧!还记得TCP: (Transmission Control Protocol) 传输控制协议? 还记得IP: (Internet Protocol ...

  3. CentOs + Nginx + php-fpm + MySql 依赖库安装

    依赖库和开发工具 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype free ...

  4. PHP22期基础班技术总结

  5. maven发布本地包,eclipse-maven集成tomcat7热部署项目

    国内maven 库 :http://maven.aliyun.com/nexus/content/groups/public/ maven安装不在中央仓库的jar包: mvn install:inst ...

  6. NYOJ-1057 寻找最大数(三)(贪心)

    寻找最大数(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的 ...

  7. 使用sublime text3 连接sftp/ftp(远程服务器)

    首先说明的是Sumblime Text 3,下载安装后,打开软件 在红色箭头指定的控制区域粘贴下面这段英文 import urllib.request,os,hashlib; h = '2915d18 ...

  8. php正则匹配中文

    <?php $str = '你是我的+****xiaopingguo _ 23947237 _+冠军终归这里'; preg_match_all('/[\x{4e00}-\x{9fa5}A-Za- ...

  9. java中的传值

    关于java中到底是传值还是传应用,有以下笔记: Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用 ...

  10. 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]

      学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...