C++线程类的封装
简单的C++线程操作的封装,使用了智能指针管理对象的释放。
可运行对象基类
class SimpleRunable:public RefCountedBase
{
public:
SimpleRunable(){}
virtual ~SimpleRunable(){}//必须为虚析构函数否则,子类析构函数无法调用
virtual void OnRun()=;//由线程调用
};
实现SimpleRunable的OnRun就可以交由SimpleThread运行。
多线程类封装
class SimpleThread
{
public:
SimpleThread(void);
~SimpleThread(void); bool Start(RefCountedPtr<SimpleRunable> runable);//创建线程
bool Stop(); //强制关闭线程,不建议使用
bool IsRunning(); //判断是否运行 RefCountedPtr<SimpleRunable> GetRunable();//获取当前可运行任务
HANDLE GetHandle(); //获取线程句柄
DWORD GetId(); // 获取线程id
private:
//禁止赋值构造
SimpleThread(const SimpleThread&);
const SimpleThread& operator=(const SimpleThread&); static void ThreadProc(void* param);
struct ThreadData* m_data;
};
使用方法如下:
class TestRunable:public SimpleRunable
{
public:
void OnRun()
{
for( int i=;i<;++i)
{
printf("t%d\t",i);
}
}
~TestRunable()
{
printf("destroy TestRunable\n");
}
}; static void TestSimpleThread()
{
SimpleThread thread;
CountedPtr<SimpleRunable> runable(new TestRunable);
thread.Start(runable);Sleep(100);
}
SimpleThread类的实现如下:
struct ThreadData
{
ThreadData():m_isRunning(false),m_handle(NULL),m_count()//m_count默认值为1,由SimpleThread所拥有
{}
~ThreadData()
{
}
bool m_isRunning;
HANDLE m_handle; int m_count;//计数
RefCountedPtr<SimpleRunable> m_runable;
}; SimpleThread::SimpleThread(void):m_data(new ThreadData)
{
} SimpleThread::~SimpleThread(void)
{
if (AtomicOps::Decrement(&m_data->m_count)==)
{
delete m_data;
}
} bool SimpleThread::Start(RefCountedPtr<SimpleRunable> runable)
{
//如果正在运行返回false
if (m_data->m_isRunning)
{
return false;
} m_data->m_runable=runable;
AtomicOps::Increment(&m_data->m_count);//该计数由ThreadProc减1 HANDLE handle=(HANDLE)_beginthread(ThreadProc,,m_data);
m_data->m_handle=handle;
if (!handle)
{
AtomicOps::Decrement(&m_data->m_count);//线程创建失败计数减一
return false;
}
else
{
m_data->m_isRunning=true;
return true;
}
} bool SimpleThread::IsRunning()
{
return m_data->m_isRunning;
} RefCountedPtr<SimpleRunable> SimpleThread::GetRunable()
{
return m_data->m_runable;
} HANDLE SimpleThread::GetHandle()
{
if (IsRunning())
return m_data->m_handle;
else
return NULL;
} DWORD SimpleThread::GetId()
{
HANDLE handle=GetHandle();
if(handle)
return GetThreadId(handle);
else
return ;
} bool SimpleThread::Stop()
{
if (m_data->m_isRunning)
{
return CloseHandle(m_data->m_handle)==TRUE;
}
else
return false;
} void SimpleThread::ThreadProc(void* param)
{
ThreadData* data=(ThreadData*)param; RefCountedPtr<SimpleRunable>& runable=data->m_runable;
if (runable)
{
runable->OnRun();
} data->m_isRunning=false;
if(AtomicOps::Decrement(&data->m_count)==)
delete data;
_endthread();
}
C++线程类的封装的更多相关文章
- 【C/C++开发】C++实现简单的线程类
C++封装一个简单的线程类 多线程编程简介: 大家在编程时,经常需要在程序中启动一个或多个线程来处理任务,而如果每次都是去调用系统创建线程的API函数来创建,代码量虽不多,但线程的创建和业务逻辑代码就 ...
- MFC--串口编程---WIN API的方式将串扣操作封装在线程类中
串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比 ...
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
- Android(java)学习笔记62:继承Thread类创建线程类
package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...
- 转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
- Delphi 实现多线程编程的线程类 TThread
http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...
随机推荐
- FileUtils类介绍
Java的文件操作太基础,缺乏很多实用工具,比如对目录的操作,支持就非常的差了.如果你经常用Java操作文件或文件夹,你会觉得反复编写这些代码是令人沮丧的问题,而且要大量用到递归. 下面是的一个解决方 ...
- Maven的安装与使用(ubuntu)
一.安装Maven 1.下载Maven,http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-m ...
- Tomcat内存不足的解决办法
Tomcat增加内存 -Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512m -DCOM.HUATENG.PRODUCTION_MODE=fa ...
- C++域宽设置
域宽设置,域宽填充; 设置域宽, cout<<set[w-width](int n)<<被设置的输出内容 设置填充字符, cout<<setfill(char n) ...
- UILabel字体加粗等属性和特效
/* Accessing the Text Attributes text property font property textColor property textAlignment pr ...
- Day 1 @ RSA Conference Asia Pacific & Japan 2016
# 国内出发 早上8:45的航班,首次从深圳机场乘坐国际航班(先前去日本.欧洲都从香港走),就提前了3个小时出发. 乘taxi到机场30分钟不到,135元.到了T3 4号出发口,发现check-in的 ...
- 非常棒的jqChart图表插件
由于项目需要,做一些类似于OA系统的应用时,表格用到的是最多的,那么图表展示就先显得尤为的重要,其中柱柱状图.折线图.饼状图又居多. 之前一直使用的是Chrome下的googleAPI中提供的char ...
- Lua 5.2 中文参考手册
闲来无事,发现Lua更新到了5.2.2,参考手册也更到了5.2,在网上发现只有云风翻译的5.1版,花了几天时间翻译了一些. 参考手册有点长,又要随时修改,所以在github上建了项目,有需要的朋友可以 ...
- jQuery--对话框插件--dialog
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 一大波Java来袭(二)异常处理
概要解析: 本章的知识点能够记为:1图+5keyword+先逮小的.后逮大的 一.基础 (一)定义 1.异常 是指在程序执行的时候发生的一些异常事件.良好的程序设计应该在异常发生的时候提供处理异常的 ...