一个Windows C++的线程类实现
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();
}
from:http://blog.csdn.net/huyiyang2010/article/details/5801597
一个Windows C++的线程类实现的更多相关文章
- 一个Windows C++的线程类实现(封装API,形成一个类,但不完善。其实可以学习一下Delphi的TThread的写法)
Thread.h #ifndef __THREAD_H__ #define __THREAD_H__ #include <string> #include <windows.h& ...
- 一个Windows C++的线程池的实现
此线程池所依赖的线程类,请参看<一个Windows C++的线程类实现>: http://blog.csdn.net/huyiyang2010/archive/2010/08/10/580 ...
- Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……
接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...
- Java带参数的线程类ParameterizedThread——即如何给Thread传递参数
在Java中似乎没有提供带运行参数的线程实现类,在第三方类库中也没有找到.网上有大量的文章在讨论这个问题,但都没有提供很好的代码封装解决方案,这令我很吃惊.如果读者知道有官方或者第三方的实现方式,欢迎 ...
- Delphi线程类 DIY(把类指针作为参数传进去,就可以执行类里面的方法啦)
Delphi 封装了一个很强大的线程类 TThread, 我们也自己动手制作一个简单的线程类 首先Type一个类 type TwwThread = class constructor Create; ...
- 转:一个跨WINDOWS LINUX平台的线程类
来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS ...
- 一个Windows下线程池的实现(C++)
前言 本文配套代码:https://github.com/TTGuoying/ThreadPool 先看看几个概念: 线程:进程中负责执行的执行单元.一个进程中至少有一个线程. 多线程:一个进程中有多 ...
- C# 模拟一个处理消息队列的线程类 Message Queue
// 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...
- 从零开始构建一个Reactor模式的网络库(二)线程类Thread
线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #if ...
随机推荐
- php 迭代器与和生成器
php有很多功能强大的接口,其中ArrayAccess 与 Iterator 的配合使用可以让对象与数组一样有着灵活的访问性. 当然,用ArrayAccess 与 Iterator 配合可以用来对付数 ...
- SQL Server 查看指定表上的索引
解决方案: sys.indexs; ---------------------------------------------------------------------------------- ...
- Invalidate(TRUE)与Invalidate(FALSE)区别(前者会发送WM_ERASEBKGND消息全部刷新,然后使用WM_PAINT消息绘制,而后者只发送WM_PAINT消息)
使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息. 使用Invalidate(FALSE)函数时,它只会向消息队列中添加了WM_P ...
- CC++初学者编程教程(6) 配置WindowsXP虚拟机与VC6.0
1.我们安装需要下列文件. 2.新建一个虚拟机. 3. 选择默认的 Vmware Work Station10.0 4. 我们选择这个WindowsXP镜像. 5. 我们复制一个WindowsXPSP ...
- 正式生产环境下hadoop集群的DNS+NFS+ssh免password登陆配置
博客地址:http://www.loveweir.com/ 环境虚拟机centos6.5 主机名h1 IP 192.168.137.11 作为DNS FNS的server 主机名h2 IP 19 ...
- Android中对闹钟Alarm的事件处理
之前的博文一直在持续分享Phone相关的知识也算是知识笔记,但在工作中难免遇到其他模块的一些问题,因此在解决这些问题的时候顺手将这些知识记录并分享出来.有些知识在不知道的时候会觉得非常难,当了解之后便 ...
- Codeforces Round #258 (Div. 2/C)/Codeforces451C_Predict Outcome of the Game(枚举)
解题报告 http://blog.csdn.net/juncoder/article/details/38102391 题意: n场比赛当中k场是没看过的,对于这k场比赛,a,b,c三队赢的场次的关系 ...
- gdb调试python
一.概述 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到哪行Python代码呢 ...
- Excel 提供数据 更新或者插入数据 通过函数 自动生成SQL语句
excel 更新数据 ="UPDATE dbo.yt_vehicleExtensionBase SET yt_purchase_date='"&B2&"' ...
- [转载自 文顶顶]iOS开发UI篇—程序启动原理和UIApplication
一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...