一个Windows C++的线程类实现(封装API,形成一个类,但不完善。其实可以学习一下Delphi的TThread的写法)
Thread.h
- #ifndef __THREAD_H__
- #define __THREAD_H__
- #include <string>
- #include <windows.h>
- #include <process.h>
- class Runnable
- {
- public:
- virtual ~Runnable() {};
- virtual void Run() = 0;
- };
- class CThread : public Runnable
- {
- private:
- explicit CThread(const CThread & rhs);
- public:
- CThread();
- CThread(Runnable * pRunnable);
- CThread(const char * ThreadName, Runnable * pRunnable = NULL);
- CThread(std::string ThreadName, Runnable * pRunnable = NULL);
- ~CThread(void);
- /**
- 开始运行线程
- @arg bSuspend 开始运行时是否挂起
- **/
- bool Start(bool bSuspend = false);
- /**
- 运行的线程函数,可以使用派生类重写此函数
- **/
- virtual void Run();
- /**
- 当前执行此函数线程等待线程结束
- @arg timeout 等待超时时间,如果为负数,等待无限时长
- **/
- void Join(int timeout = -1);
- /**
- 恢复挂起的线程
- **/
- void Resume();
- /**
- 挂起线程
- **/
- void Suspend();
- /**
- 终止线程的执行
- **/
- bool Terminate(unsigned long ExitCode);
- unsigned int GetThreadID();
- std::string GetThreadName();
- void SetThreadName(std::string ThreadName);
- void SetThreadName(const char * ThreadName);
- private:
- static unsigned int WINAPI StaticThreadFunc(void * arg);
- private:
- HANDLE m_handle;
- Runnable * const m_pRunnable;
- unsigned int m_ThreadID;
- std::string m_ThreadName;
- volatile bool m_bRun;
- };
- #endif
Thread.cpp
- #include "Thread.h"
- CThread::CThread(void) :
- m_pRunnable(NULL),
- m_bRun(false)
- {
- }
- CThread::~CThread(void)
- {
- }
- CThread::CThread(Runnable * pRunnable) :
- m_ThreadName(""),
- m_pRunnable(pRunnable),
- m_bRun(false)
- {
- }
- CThread::CThread(const char * ThreadName, Runnable * pRunnable) :
- m_ThreadName(ThreadName),
- m_pRunnable(pRunnable),
- m_bRun(false)
- {
- }
- CThread::CThread(std::string ThreadName, Runnable * pRunnable) :
- m_ThreadName(ThreadName),
- m_pRunnable(pRunnable),
- m_bRun(false)
- {
- }
- bool CThread::Start(bool bSuspend)
- {
- if(m_bRun)
- {
- return true;
- }
- if(bSuspend)
- {
- m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, CREATE_SUSPENDED, &m_ThreadID);
- }
- else
- {
- m_handle = (HANDLE)_beginthreadex(NULL, 0, StaticThreadFunc, this, 0, &m_ThreadID);
- }
- m_bRun = (NULL != m_handle);
- return m_bRun;
- }
- void CThread::Run()
- {
- if(!m_bRun)
- {
- return;
- }
- if(NULL != m_pRunnable)
- {
- m_pRunnable->Run();
- }
- m_bRun = false;
- }
- void CThread::Join(int timeout)
- {
- if(NULL == m_handle || !m_bRun)
- {
- return;
- }
- if(timeout <= 0)
- {
- timeout = INFINITE;
- }
- ::WaitForSingleObject(m_handle, timeout);
- }
- void CThread::Resume()
- {
- if(NULL == m_handle || !m_bRun)
- {
- return;
- }
- ::ResumeThread(m_handle);
- }
- void CThread::Suspend()
- {
- if(NULL == m_handle || !m_bRun)
- {
- return;
- }
- ::SuspendThread(m_handle);
- }
- bool CThread::Terminate(unsigned long ExitCode)
- {
- if(NULL == m_handle || !m_bRun)
- {
- return true;
- }
- if(::TerminateThread(m_handle, ExitCode))
- {
- ::CloseHandle(m_handle);
- return true;
- }
- return false;
- }
- unsigned int CThread::GetThreadID()
- {
- return m_ThreadID;
- }
- std::string CThread::GetThreadName()
- {
- return m_ThreadName;
- }
- void CThread::SetThreadName(std::string ThreadName)
- {
- m_ThreadName = ThreadName;
- }
- void CThread::SetThreadName(const char * ThreadName)
- {
- if(NULL == ThreadName)
- {
- m_ThreadName = "";
- }
- else
- {
- m_ThreadName = ThreadName;
- }
- }
- unsigned int CThread::StaticThreadFunc(void * arg)
- {
- CThread * pThread = (CThread *)arg;
- pThread->Run();
- return 0;
- }
用法:
#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的写法)的更多相关文章
- 一个Windows C++的线程池的实现
此线程池所依赖的线程类,请参看<一个Windows C++的线程类实现>: http://blog.csdn.net/huyiyang2010/archive/2010/08/10/580 ...
- php函数、类和对象以及类的封装、继承、类的静态方法、静态属性
1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数 ...
- 编写Java程序,实现对兵营类的封装,将兵营类中的所有属性设置为私有访问权限,方法设置为公有访问权限
返回本章节 返回作业目录 需求说明: 实现对兵营类的封装 将兵营类中的所有属性设置为私有访问权限. 将兵营类中所有属性的赋值方法设置为公有访问权限. 要求兵营名称的长度在4-8位之间. 要求兵营士兵的 ...
- 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】
day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...
- 一个Windows C++的线程类实现
Thread.h [cpp] view plaincopy #ifndef __THREAD_H__ #define __THREAD_H__ #include <string> #inc ...
- C++中的类与封装
1,类的组合: 1,类不是孤立存在的,类之间都会有一些关系,组合就是类的基本关系之一: 2,电脑一般而言是由 CPU.内存.主板.键盘和硬盘等部件组合而成: 3,学习电脑组装需要多少时间?学习电脑组装 ...
- 一个Windows下线程池的实现(C++)
前言 本文配套代码:https://github.com/TTGuoying/ThreadPool 先看看几个概念: 线程:进程中负责执行的执行单元.一个进程中至少有一个线程. 多线程:一个进程中有多 ...
- C++线程类的封装
简单的C++线程操作的封装,使用了智能指针管理对象的释放. 可运行对象基类 class SimpleRunable:public RefCountedBase { public: SimpleRuna ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
随机推荐
- ios开发网络学习二:URL转码以及字典转模型框架MJExtension的使用
一:url转码,当url中涉及到中文的时候,要考虑转码,用UTF8对中文的url进行转码 #import "ViewController.h" @interface ViewCon ...
- [RxJS] Flatten a higher order observable with mergeAll in RxJS
Among RxJS flattening operators, switch is the most commonly used operator. However, it is important ...
- ios开发之手势处理 之手势识别一
#import "ViewController.h" @interface ViewController ()<UIGestureRecognizerDelegate> ...
- ios开发之多线程---GCD
一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...
- iOS app审核参考信息地址
发件人:(苹果开发支持邮箱地址) 中国区电话:400-670-1855 chinadev<chinadev@asia.apple.com> 您好: 感谢您与 Apple 开发者计划支持 ...
- iOS常用加密方法(aes、md5、base64)
1.代码 iOS常用加密方法(aes.md5.base64) .AES加密 NSData+AES.h文件 // // NSData-AES.h // Smile // // Created by 周 ...
- 对Java JVM中类加载几点解释
1.用到类的时候,类加载到方法区,同时方法区会存放static的内容(包括静态方法和静态变量),随类的加载而加载 2当new的时候,会在堆中创建一个对象,在其中会开辟其中的实例变量内存并初始化,堆中变 ...
- sqoop 创建job时 java.lang.NoClassDefFoundError: org/json/JSONObject
缺少jar包 到maven仓库下载json in java 之后把jar包上传至sqoop的lib目录下即可
- Babel与Polyfill的关系和区别
很多同学搞不清楚babel与polyfill的关系以及区别,这儿给大家细致解惑. Babel:Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码.注意:Babel 默 ...
- 一种基于uCos-II操作系统和lwIP协议栈的IEEE-1588主站以及基于该主站的报文处理方法
主站以及应用于电力系统的支持IEEE‐1588协议的主时钟(IEEE‐1588主站)的实现方法.该方法是在一个低成本的硬件平台上,借助uCos‐II操作系统和TCP/IP的协议栈,对以太网数据进行了分 ...