Thread.h

  1. #ifndef __THREAD_H__
  2. #define __THREAD_H__
  3. #include <string>
  4. #include   <windows.h>
  5. #include   <process.h>
  6. class Runnable
  7. {
  8. public:
  9. virtual ~Runnable() {};
  10. virtual void Run() = 0;
  11. };
  12. class CThread : public Runnable
  13. {
  14. private:
  15. explicit CThread(const CThread & rhs);
  16. public:
  17. CThread();
  18. CThread(Runnable * pRunnable);
  19. CThread(const char * ThreadName, Runnable * pRunnable = NULL);
  20. CThread(std::string ThreadName, Runnable * pRunnable = NULL);
  21. ~CThread(void);
  22. /**
  23. 开始运行线程
  24. @arg bSuspend 开始运行时是否挂起
  25. **/
  26. bool Start(bool bSuspend = false);
  27. /**
  28. 运行的线程函数,可以使用派生类重写此函数
  29. **/
  30. virtual void Run();
  31. /**
  32. 当前执行此函数线程等待线程结束
  33. @arg timeout 等待超时时间,如果为负数,等待无限时长
  34. **/
  35. void Join(int timeout = -1);
  36. /**
  37. 恢复挂起的线程
  38. **/
  39. void Resume();
  40. /**
  41. 挂起线程
  42. **/
  43. void Suspend();
  44. /**
  45. 终止线程的执行
  46. **/
  47. bool Terminate(unsigned long ExitCode);
  48. unsigned int GetThreadID();
  49. std::string GetThreadName();
  50. void SetThreadName(std::string ThreadName);
  51. void SetThreadName(const char * ThreadName);
  52. private:
  53. static unsigned int WINAPI StaticThreadFunc(void * arg);
  54. private:
  55. HANDLE m_handle;
  56. Runnable * const m_pRunnable;
  57. unsigned int m_ThreadID;
  58. std::string m_ThreadName;
  59. volatile bool m_bRun;
  60. };
  61. #endif

Thread.cpp

  1. #include "Thread.h"
  2. CThread::CThread(void) :
  3. m_pRunnable(NULL),
  4. m_bRun(false)
  5. {
  6. }
  7. CThread::~CThread(void)
  8. {
  9. }
  10. CThread::CThread(Runnable * pRunnable) :
  11. m_ThreadName(""),
  12. m_pRunnable(pRunnable),
  13. m_bRun(false)
  14. {
  15. }
  16. CThread::CThread(const char * ThreadName, Runnable * pRunnable) :
  17. m_ThreadName(ThreadName),
  18. m_pRunnable(pRunnable),
  19. m_bRun(false)
  20. {
  21. }
  22. CThread::CThread(std::string ThreadName, Runnable * pRunnable) :
  23. m_ThreadName(ThreadName),
  24. m_pRunnable(pRunnable),
  25. m_bRun(false)
  26. {
  27. }
  28. bool CThread::Start(bool bSuspend)
  29. {
  30. if(m_bRun)
  31. {
  32. return true;
  33. }
  34. if(bSuspend)
  35. {
  36. m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, CREATE_SUSPENDED, &m_ThreadID);
  37. }
  38. else
  39. {
  40. m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, 0, &m_ThreadID);
  41. }
  42. m_bRun = (NULL != m_handle);
  43. return m_bRun;
  44. }
  45. void CThread::Run()
  46. {
  47. if(!m_bRun)
  48. {
  49. return;
  50. }
  51. if(NULL != m_pRunnable)
  52. {
  53. m_pRunnable->Run();
  54. }
  55. m_bRun = false;
  56. }
  57. void CThread::Join(int timeout)
  58. {
  59. if(NULL == m_handle || !m_bRun)
  60. {
  61. return;
  62. }
  63. if(timeout <= 0)
  64. {
  65. timeout = INFINITE;
  66. }
  67. ::WaitForSingleObject(m_handle, timeout);
  68. }
  69. void CThread::Resume()
  70. {
  71. if(NULL == m_handle || !m_bRun)
  72. {
  73. return;
  74. }
  75. ::ResumeThread(m_handle);
  76. }
  77. void CThread::Suspend()
  78. {
  79. if(NULL == m_handle || !m_bRun)
  80. {
  81. return;
  82. }
  83. ::SuspendThread(m_handle);
  84. }
  85. bool CThread::Terminate(unsigned long ExitCode)
  86. {
  87. if(NULL == m_handle || !m_bRun)
  88. {
  89. return true;
  90. }
  91. if(::TerminateThread(m_handle, ExitCode))
  92. {
  93. ::CloseHandle(m_handle);
  94. return true;
  95. }
  96. return false;
  97. }
  98. unsigned int CThread::GetThreadID()
  99. {
  100. return m_ThreadID;
  101. }
  102. std::string CThread::GetThreadName()
  103. {
  104. return m_ThreadName;
  105. }
  106. void CThread::SetThreadName(std::string ThreadName)
  107. {
  108. m_ThreadName = ThreadName;
  109. }
  110. void CThread::SetThreadName(const char * ThreadName)
  111. {
  112. if(NULL == ThreadName)
  113. {
  114. m_ThreadName = "";
  115. }
  116. else
  117. {
  118. m_ThreadName = ThreadName;
  119. }
  120. }
  121. unsigned int CThread::StaticThreadFunc(void * arg)
  122. {
  123. CThread * pThread = (CThread *)arg;
  124. pThread->Run();
  125. return 0;
  126. }

用法:

#include "Thread.h"
#include "ThreadPoolExecutor.h"

class R : public Runnable
{
public:
    ~R()
    {
        printf("~R/n");
    }
    void Run()
    {
        printf("Hello World/n");
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    R r;
    CThread * t = NULL;
    t = new CThread(&r);
    t->Start();
    t->Join();

getchar();

}

http://blog.csdn.net/huyiyang2010/article/details/5801597

一个Windows C++的线程类实现(封装API,形成一个类,但不完善。其实可以学习一下Delphi的TThread的写法)的更多相关文章

  1. 一个Windows C++的线程池的实现

    此线程池所依赖的线程类,请参看<一个Windows C++的线程类实现>: http://blog.csdn.net/huyiyang2010/archive/2010/08/10/580 ...

  2. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    1.函数     php内置函数可以直接使用,如果没有安装php扩展即可     自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数 ...

  3. 编写Java程序,实现对兵营类的封装,将兵营类中的所有属性设置为私有访问权限,方法设置为公有访问权限

    返回本章节 返回作业目录 需求说明: 实现对兵营类的封装 将兵营类中的所有属性设置为私有访问权限. 将兵营类中所有属性的赋值方法设置为公有访问权限. 要求兵营名称的长度在4-8位之间. 要求兵营士兵的 ...

  4. 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】

    day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...

  5. 一个Windows C++的线程类实现

    Thread.h [cpp] view plaincopy #ifndef __THREAD_H__ #define __THREAD_H__ #include <string> #inc ...

  6. C++中的类与封装

    1,类的组合: 1,类不是孤立存在的,类之间都会有一些关系,组合就是类的基本关系之一: 2,电脑一般而言是由 CPU.内存.主板.键盘和硬盘等部件组合而成: 3,学习电脑组装需要多少时间?学习电脑组装 ...

  7. 一个Windows下线程池的实现(C++)

    前言 本文配套代码:https://github.com/TTGuoying/ThreadPool 先看看几个概念: 线程:进程中负责执行的执行单元.一个进程中至少有一个线程. 多线程:一个进程中有多 ...

  8. C++线程类的封装

    简单的C++线程操作的封装,使用了智能指针管理对象的释放. 可运行对象基类 class SimpleRunable:public RefCountedBase { public: SimpleRuna ...

  9. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

随机推荐

  1. jquery-9 京东和酒仙网左侧导航如何实现

    jquery-9 京东和酒仙网左侧导航如何实现 一.总结 一句话总结:布局的话多用定位,由底往上一层层的来布. 1.如何实现导航向div的平滑滑动? 右侧div和左侧的li一定要放在一起 127 &l ...

  2. 监听text等的改变事件

    oninput事件是html5的标准事件,支持ie9和以上以及其他的火狐啊谷歌啊等浏览器 ie9以下的可以用onpropertychange <head>     <script t ...

  3. android,安卓get请求的提交以及我遇到的异常

    首先说明 我是安卓4.0以上的版本,这个时候直接用网上的代码会报错的,先赋上网上的普遍代码 String uri = "http://url"; HttpGet httpGet = ...

  4. Matlab图像处理系列4———图像傅立叶变换与反变换

    注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...

  5. MySQL经常使用的面试题

    1.怎样登陆mysql数据库 MySQL -u username -p 2.怎样开启/关闭mysql服务 service mysql start/stop 3.查看mysql的状态 service m ...

  6. Tor (洋葱头)torbrowser

    Tor是什么 Tor是互联网上用于保护您隐私最有力的工具之一,但是时至今日仍有许多人往往认为Tor是一个终端加密工具.事实上,Tor是用来匿名浏览网页和邮件发送(并非是邮件内容加密)的.今天,我们要讨 ...

  7. iPad和iPhone开发的异同

    niPad和iPhone开发的异同   niPad简介 n什么是iPad p一款苹果公司于2010年发布的平板电脑 p定位介于苹果的智能手机iPhone和笔记本电脑产品之间 p跟iPhone一样,搭载 ...

  8. 并发新特性—Executor 框架与线程池

    兰亭风雨 · 更新于 2018-11-14 09:00:31 并发新特性-Executor 框架与线程池 Executor 框架简介 在 Java 5 之后,并发编程引入了一堆新的启动.调度和管理线程 ...

  9. 与Boss大雷探讨JavaWeb开发、电商与网络安全

    最近几个月,与公司Boss大雷交流得比较多,也学习到了很多新的东西,了解到了一些没有接触和实践的业界做法. 简要介绍下Boss,姓雷,定居武汉好几年了,之前在一号店.UC.支付宝干过,有丰富的电商-支 ...

  10. 利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...