工作线程基类TaskSvc
工作线程基类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的更多相关文章
- C#WinForm线程基类
在CS模式开发中一般我们需要用到大量的线程来处理比较耗时的操作,以防止界面假死带来不好的体验效果,下面我将我定义的线程基类给大家参考下,如有问题欢迎指正. 基类代码 #region 方法有返回值 // ...
- 衔接UI线程和管理后台工作线程的类(多线程、异步调用)
一个不错的UI多线程操作类 http://www.cnblogs.com/net66/archive/2005/08/03/206132.html
- 编写高质量代码改善C#程序的157个建议[勿选List<T>做基类、迭代器是只读的、慎用集合可写属性]
前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议23.避免将List<T>作为自定义集合类的基 ...
- c#通用多线程基类,以队列形式
c#通用多线程基类,以队列形式 个人原创.欢迎转载.转载请注明出处.http://www.cnblogs.com/zetee/p/3487084.html 多线程这个概念大家都很熟悉,对于winfor ...
- IntentService 服务 工作线程 stopself MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- linux通过c++实现线程池类
目录 线程池的实现 线程池已基于C++11重写 : 基于C++11实现线程池的工作原理 前言 线程池的概念 使用原因及适用场合 线程池的实现原理 程序测试 线程池的实现 线程池已基于C++11重写 : ...
- 线程 ManualResetEvent 类
Reset(): 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时, 它调用 Reset 以将 ManualResetEvent 置于非终止状态.此线程可被视为控制 ManualRese ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- 基类子类在Qt信号量机制下的思考
背景知识: 基类 superClass class superClass { public: superClass() { std::string m = "superClass() &qu ...
随机推荐
- UserDefault数据读取
//GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer{pu ...
- Meta标签中的format-detection属性及含义让IPHONE的数字可以改变颜色
format-detection翻译成中文的意思是“格式检测”,顾名思义,它是用来检测html里的一些格式的,那关于meta的format-detection属性主要是有以下几个设置: meta na ...
- iis无法加载样式
- Namespacing in PHP (php 中使用命名空间)
最近学习一下php的命名空间,中文文档不多,搜到一篇英文的,讲的还蛮系统的,特此翻译一下,以备以后查阅,大家有什么高见或更深刻或者 更悟透的见解希望能不吝赐教,晚辈感激不尽. 原文: http://c ...
- redis10--主从模式
redis的主从模式(1)介绍redis存储数据是在内存中运行的,运行速度比关系型数据库要快一些.而且它具有SortSet/Hash等具有特色的数据类型,这是其它数据库无法比拟的.redis有增删改查 ...
- [Rails] 设计模式 MVC
使用 MVC 的Web开发框架有很多,比如 PHP 的 Zend,Python 的 Django 和 Golang 的 Beego.这篇文章主要介绍一下 MVC 的基本概念. 何为MVC 为了明确一个 ...
- 8VC Venture Cup 2017 - Elimination Round
传送门:http://codeforces.com/contest/755 A题题意是给你一个数字n,让你找到一个数字m,使得n*m+1为合数,范围比较小,直接线性筛出1e6的质数,然后暴力枚举一下就 ...
- 实现自动备份MySQL数据库
#!/bin/bash base="/zsjdata/mysql/data" date=$(date +%Y%m%d) hour=$(date +%H) time=$(date + ...
- 两种为wangEditor添加拖拽调整高度的方式:CSS3和jQuery UI
wangEditor是一款优秀的Web富文本编辑器,但如果能像KindEditor那样支持拖拽调整高度就更好了.有两种方式可以为wangEditor添加这一功能,这里使用的wangEditor版本为2 ...
- socket编程——一个简单的例子
从一个简单的使用TCP例子开始socket编程,其基本步骤如下: server client ++++ ...