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();

}

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

一个Windows C++的线程类实现的更多相关文章

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

    Thread.h #ifndef __THREAD_H__ #define __THREAD_H__ #include <string> #include   <windows.h& ...

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

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

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

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

  4. Java带参数的线程类ParameterizedThread——即如何给Thread传递参数

    在Java中似乎没有提供带运行参数的线程实现类,在第三方类库中也没有找到.网上有大量的文章在讨论这个问题,但都没有提供很好的代码封装解决方案,这令我很吃惊.如果读者知道有官方或者第三方的实现方式,欢迎 ...

  5. Delphi线程类 DIY(把类指针作为参数传进去,就可以执行类里面的方法啦)

    Delphi 封装了一个很强大的线程类 TThread, 我们也自己动手制作一个简单的线程类 首先Type一个类 type TwwThread = class constructor Create;  ...

  6. 转:一个跨WINDOWS LINUX平台的线程类

     来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...

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

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

  8. C# 模拟一个处理消息队列的线程类 Message Queue

    // 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...

  9. 从零开始构建一个Reactor模式的网络库(二)线程类Thread

    线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...

随机推荐

  1. PHPMailer发送邮件方法

    /** * * 测试邮件发送s * @param 服务器 $Host * @param 端口 $Port * @param 昵称 $Fromname * @param 身份验证用户名 $Usernam ...

  2. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

  3. Python之路第四天,基础(4)-装饰器,迭代器,生成器

    装饰器 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象 ...

  4. 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学、女性课程、高级研修班、心理学、EWP_培训通课程

    复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学.女性课程.高级研修班.心理学.EWP_培训通课程 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期)    学      ...

  5. Asp.net SqlDataReader转成Datatable

    Asp.net SqlDataReader转成Datatable 所属栏目:Asp.net 编程 | 发布日期:2013年04月05日 | 点击:517 次 内容摘要:Asp.net 数据存储,呈现方 ...

  6. CSS3实战开发 表单发光特效实战开发

    首先,我们先准备好html代码: <!doctype html> <html> <head> <meta charset="utf-8"& ...

  7. mysql数据库日期是varchar类型的时间比较查询

     单纯的字符串比较结果不精确. select * from 表明 where times> '2088/12/8 10:02:40' (×) 转换函数如下(数据库为varchar): selec ...

  8. html系列教程--DOCTYPE a area

    <!DOCTYPE>标签:<!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令.在 HTML 4.01 中,& ...

  9. IIS Express中如何配置支持json

    今天在使用i18next的时候,由于要加载一个json的文件,但是在vs2013中一直加载不成功呢,经过上网查资料得知原来要配置iis express才能支持json文件的加载. 文件的默认位置在:C ...

  10. 安装rac遇到的问题总结:

    1. 选择虚拟机工具 这个过程是非常的波折.这次安装也让我吸取了很大教训,获得了宝贵经验. 首先啊,必须了解rac的机制. 共享磁盘+多实例. 这就意味着,我们必须使用一个支持共享磁盘的虚拟机. 第一 ...