一个最经典的线程类

这个类源代码来源于网上流传的魔域的代码,自己翻来覆去仿写了好多遍都觉得很好用,所以拿出来与大家分享,希望别人什么时候也用得着。

 

.h

 

 

#ifndef THREADBASE_H

#define THREADBASE_H

 

#include <afxmt.h>

//#include <windows.h>

 

 

class CThreadBase

{

protected: // 构造、析构

CThreadBase();

virtual ~CThreadBase();

 

public: // 公共,由父线程调用。

bool CreateThread(bool bRun = true); // false: 暂不运行,用 ResumeThread() 运行

 

bool ResumeThread(); // return false: 失败

 

// 通知子线程关闭,并阻塞 nMilliseconds 毫秒。返回true: 线程关闭成功

bool CloseThread(long nMilliseconds = 0);

 

/

protected: // 派生用

virtual void OnInit();

virtual bool OnProcess(); // 不需要返回DWORD

virtual void OnDestroy();

 

/

private: // 内部使用

bool IsCloseEvent(long nMilliseconds = 0); // 检查关闭线程事件是否触发。用于 ThreadProc() 函数调用

DWORD ThreadProc();

bool IsCreated();

 

protected:

// CCriticalSection m_xCtrl; // 用于派生类中的变量共享控制

HANDLE m_hThread;

HANDLE m_hCloseThreadEvent;

CCriticalSection m_xCtrl;

 

/

private:

static DWORD WINAPI TrueThreadProc(LPVOID pParam);

};

#endif // THREADBASE_H

 

 

 

 

.cpp

 

 

#include "StdAfx.h"

#include "ThreadBase.h"

 

CThreadBase::CThreadBase(void)

{

m_hThread = NULL;

m_hCloseThreadEvent = NULL;

}

 

CThreadBase::~CThreadBase(void)

{

if (NULL != m_hThread)

{

if (::WaitForSingleObject(m_hThread,0) == WAIT_TIMEOUT)

{

::TerminateThread(m_hThread,5);

}

::CloseHandle(m_hThread);

m_hThread = NULL;

}

if (m_hCloseThreadEvent)

{

::CloseHandle(m_hCloseThreadEvent);

m_hCloseThreadEvent = NULL;

}

}

 

bool CThreadBase::CreateThread(bool bRun /* = true */)

{

if (!IsCreated())

{

m_hCloseThreadEvent = ::CreateEvent(NULL,false,false,NULL);

if (NULL == m_hCloseThreadEvent)

{

return false;

}

DWORD dwThreadID = 0;

DWORD dwCreateFlag = bRun ? 0 : CREATE_SUSPENDED;

m_hThread = ::CreateThread(NULL,0,TrueThreadProc,(void*)this,dwCreateFlag,&dwThreadID);

if (NULL != m_hThread)

{

return true;

}

else

{

::CloseHandle(m_hCloseThreadEvent);

m_hCloseThreadEvent = NULL;

return false;

}

}

 

return false;

}

 

bool CThreadBase::ResumeThread()

{

if (NULL != m_hThread)

{

if (::ResumeThread(m_hThread) != -1)

{

return false;

}

else

{

int err = GetLastError();

ASSERT(!err);

return true;

}

}

return false;

}

 

bool CThreadBase::CloseThread(long nMilliseconds /* = 0 */)

{

if (NULL != m_hThread)

{

::ResumeThread(m_hThread);

::SetEvent(m_hCloseThreadEvent);

if (::WaitForSingleObject(m_hThread,nMilliseconds) != WAIT_TIMEOUT)

{

CloseHandle(m_hThread);

m_hThread = NULL;

CloseHandle(m_hCloseThreadEvent);

m_hCloseThreadEvent = NULL;

return true;

}

else

{

return false;

}

}

return true;

}

 

bool CThreadBase::IsCreated()

{

return (m_hThread != NULL);

}

 

void CThreadBase::OnInit()

{

// Do Nothing Here

}

 

bool CThreadBase::IsCloseEvent(long nMilliseconds /* = 0 */)

{

if (::WaitForSingleObject(m_hCloseThreadEvent,nMilliseconds) != WAIT_TIMEOUT)

{

return true;

}

return false;

}

 

bool CThreadBase::OnProcess()

{

// Do Nothing here

return false;

}

 

void CThreadBase::OnDestroy()

{

// Do Nothing Here

}

 

DWORD CThreadBase::ThreadProc()

{

DWORD bRet = 0;

OnInit();

while (!IsCloseEvent())

{

if (!OnProcess())

{

bRet = 2;

break;

}

}

OnDestroy();

return bRet;

}

 

DWORD WINAPI CThreadBase::TrueThreadProc(LPVOID pParam)

{

CThreadBase *pThread = (CThreadBase*)(pParam);

return pThread->ThreadProc();

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值