工作线程基类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 ...
随机推荐
- SQLSERVER 的联接查询写法
1.内连接 语法:[JOIN.INNER JOIN] 作用:两个表相连,加上ON匹配两个表的共同条件. 实例1: SELECT tb_o_i.* FROM tb_o_i INNER JOIN tb_o ...
- sudo密码错误的解决办法
按一下Caps Lock键,如果大写灯亮了,再按一下. 然后重新输入sudo密码,尝试.
- web.xml Attribute "xmlns" was already specified for element "web-app"
报错信息:Attribute "xmlns" was already specified for element "web-app" 由于项目的重命名,出现了x ...
- sqlserver 更改跟踪相关知识
数据捕获相关文章: http://www.cnblogs.com/lyhabc/p/3383484.html http://www.cnblogs.com/chenmh/p/4408825.html ...
- php 中文转拼音首字母问题
<?php /* 中文汉字转拼音首字母的PHP简易实现方法. 要求: 只能是GB2312码表里面中文字符 转换得到字符串对应的拼音首字母大写. 用法: echo zh2py::conv('Chi ...
- php登录利用$token验证
<?php $module = $_GET['module']; $action = $_GET['action']; $token = md5sum($module.date('Y-m-d', ...
- 《JavaScript高级程序设计》读书笔记 ---理解对象
上一章曾经介绍过,创建自定义对象的最简单方式就是创建一个Object 的实例,然后再为它添加属性和方法,如下所示.var person = new Object();person.name = &qu ...
- Hibernate5--课程笔记1
Hibernate简介: Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hib ...
- linux远程登录ssh免密码
原文链接,感谢原作者. (一)问题: 假如我们现在有两台机器:ServerA和ServerB,现在想要让ServerA不用输入密码就能够进行访问. (二)方法和原理: 我们使用ssh-keygen在S ...
- CENTOS7小注意
由于第一次使用 Linux CENTOS ,所以安装了图形界面,但是在终端执行yum 安装的时候,总是提示 Existing lock /var/run/yum.pid: another copy i ...