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书藉 ...
随机推荐
- Bzoj 2789: [Poi2012]Letters 树状数组,逆序对
2789: [Poi2012]Letters Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 278 Solved: 185[Submit][Stat ...
- B树,B-树,B+树,B*树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...
- java 大数据处理之内存溢出解决办法(一)
http://my.oschina.net/songhongxu/blog/209951 一.内存溢出类型 1.java.lang.OutOfMemoryError: PermGen space JV ...
- (转)在javascript中关于submit和button提交表单区别
原文来自:http://www.jb51.net/article/42236.htm submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和b ...
- asp.net中利用session对象传递、共享数据[session用法]
下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...
- xcode6下使用autolayout+sizeclass实践
历史车轮滚滚向前,将autolayout配合sizeclass做布局的方式推上了主流,虽然有点晚,但最终还是进行了一次完整的实践,特此记录一下: 因为网上已经有很多博客介绍了autolayout配合s ...
- DNS的查找机制、中文扩展,及其对手机扫描商标名称的支持
DNS的查找机制.中文扩展.及其对手机扫描商标名称的支持 DNS的查找机制 当DNS查找主机时,它首先在本域里查找,假设找不到则交给更上一级的域查找,直至顶级的域. 因此,假设计算机在北大域名(pku ...
- JAVA中toString方法的作用(转)
因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不 ...
- linux-0.11内核 调试教程+GCC源代码
http://pan.baidu.com/share/home?uk=453348606&view=share#category/type=0 http://blog.csdn.net/old ...
- C# - 类型
C#是一门使用OOP技术的编程语言(Object Oriented Programming 面向对象编程)面向对象最重要的特性就是接口.继承.多态 C#中所有的事物都可以看做是一个对象 对象由类型来创 ...