简单的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++线程类的封装的更多相关文章

  1. 【C/C++开发】C++实现简单的线程类

    C++封装一个简单的线程类 多线程编程简介: 大家在编程时,经常需要在程序中启动一个或多个线程来处理任务,而如果每次都是去调用系统创建线程的API函数来创建,代码量虽不多,但线程的创建和业务逻辑代码就 ...

  2. MFC--串口编程---WIN API的方式将串扣操作封装在线程类中

    串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比 ...

  3. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  4. 学习笔记: Delphi之线程类TThread

    新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...

  5. Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……

    接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...

  6. Delphi中线程类TThread实现多线程编程1---构造、析构……

    参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...

  7. Android(java)学习笔记62:继承Thread类创建线程类

    package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...

  8. 转发 Delphi中线程类TThread 实现多线程编程

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...

  9. Delphi 实现多线程编程的线程类 TThread

    http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...

随机推荐

  1. uploadify上传图片(限制最多五张)

    项目中遇到图片上传的情况,好多都是使用服务器上传控件进行上传的,很是不爽. 然后在网上找到了uploadify的方法,自己总结和修改后分享给大家. 项目文档预览: 1.引用原有css和js    &l ...

  2. linux 多线程基础4

    六.线程的作用域 函数pthread_attr_setscope和pthread_attr_getscope分别用来设置和得到线程的作用域,这两个函数的定义如下: 7. 名称:: pthread_at ...

  3. 开发小技巧:C#逐个输出字符

    静态自定义方法: static int counter = 0; static string displayString = "This string will appear one let ...

  4. 利用setTimeOut 和clearTimeOut 方法控制写一个 滑动导航显示不同信息的效果

    效果如图鼠标滑动导航  下边显示不同效果 html代码和css格式代码 <body><div id="tab" class="tab"> ...

  5. Unity3D跨平台时partial分部方法的使用

    最近看到项目中插件的一部分逻辑,发现问题多多,可读性很差,并且容易出错,于是随手整理了下逻 辑.Unity3D的插件逻辑,因为要考虑到针对各平台的移植,因此会大片的出现#if/#endif等条件编译, ...

  6. <input type="radio" >与<input type="checkbox">值得获取

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5

    Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of ...

  8. 通过DAC来连接SQL Server

    最早知道能够使用专用管理员连接.来连接到sql server.可是一直没有成功连接过.今天又看到这个,于是想再试试. 1.通过在ssms中的"连接到server对话框"中的serv ...

  9. MySQL源码:索引相关的数据结构

    http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索 ...

  10. hdu4504java

    import java.util.*;  class   Main{ public static void main(String[] args) { Scanner cin=new Scanner( ...