线程封装类(3) win

时间:2021-10-30 21:53:15
#ifndef _WORKTHREAD_H_
#define _WORKTHREAD_H_


#if _MSC_VER > 1000
#pragma once
#endif 




#include <windows.h>


//回调函数指针
typedef void (*THREAD_ROUTINE)(void *);


class CWorkThread  
{
public:
CWorkThread();
virtual ~CWorkThread();


public:
// 创建线程
HRESULT Create(THREAD_ROUTINE pfn, void *pArg);


// 停止线程
void Stop();


// 挂起线程
void Suspend();


// 恢复线程
void Resume();


// 等待线程退出
void Join();


// 获取线程的优先级
int SetPriority(int nPriority);


// 设置优先级
int GetPriority();


// 线程函数
    static unsigned long __stdcall ThreadFunction(void* pArg);


//线程启动函数
int StartThread();


protected:
// 线程句柄
HANDLE         m_threadHandle;

// 线程ID
unsigned long  m_threadId;


// 线程的运行例程
    THREAD_ROUTINE m_pfnRoutine;


// 线程例程的参数
    void          *m_pArg;
};


#endif 




#include "stdafx.h"
#include "WorkThread.h"




CWorkThread::CWorkThread()
{
m_threadHandle = NULL;
m_threadId     = 0;
    m_pfnRoutine   = NULL;
    m_pArg         = NULL;
}


CWorkThread::~CWorkThread()
{
if(m_threadHandle)
{
/// CloseHandle(m_threadHandle);
}
}


/********************************************************************
  函数名 : HRESULT Create(THREAD_ROUTINE pfn, void *pArg)
  功  能 : 创建线程
  参  数 : pfn  -- 线程的执行函数
           pArg -- 线程函数的参数
  返回值 : S_OK--操作成功; 其他--操作失败 
********************************************************************/
HRESULT CWorkThread::Create(THREAD_ROUTINE pfn, void *pArg)
{
    m_pfnRoutine = pfn;
    m_pArg       = pArg;


m_threadHandle = ::CreateThread(
NULL, 0, ThreadFunction, this, 0, &m_threadId);
if(m_threadHandle)
{
return S_OK;
}

return S_FALSE;
}


/********************************************************************
  函数名 : void Stop(void)
  功  能 : 停止线程
  参  数 : None
  返回值 : None
********************************************************************/
void CWorkThread::Stop(void)
{
::TerminateThread(m_threadHandle, 0);
}


/********************************************************************
  函数名 : void Suspend(void)
  功  能 : 挂起线程
  参  数 : None
  返回值 : None
********************************************************************/
void CWorkThread::Suspend(void)
{
::SuspendThread(m_threadHandle);
}


/********************************************************************
  函数名 : void Resume(void)
  功  能 : 恢复线程
  参  数 : None
  返回值 : None
********************************************************************/
void CWorkThread::Resume(void)
{
::ResumeThread(m_threadHandle);
}


/********************************************************************
  函数名 : void Join(void)
  功  能 : 等待线程退出
  参  数 : None
  返回值 : None
********************************************************************/
void CWorkThread::Join(void)
{
::WaitForSingleObject(m_threadHandle, INFINITE);
}


/********************************************************************
  函数名 : int SetPriority(int nPriority)
  功  能 : 获取线程的优先级
  参  数 : nPriority -- 线程的优先级
  返回值 : 线程的优先级
********************************************************************/
int CWorkThread::SetPriority(int nPriority)
{
int nOld = ::GetThreadPriority(m_threadHandle);


::SetThreadPriority(m_threadHandle, nPriority);


return (nOld);
}


/********************************************************************
  函数名 : int GetPriority(void)
  功  能 : 设置优先级
  参  数 : None
  返回值 : 线程的优先级
********************************************************************/
int CWorkThread::GetPriority(void)
{
return (::GetThreadPriority(m_threadHandle));
}


/********************************************************************
  函数名 : unsigned long ThreadFunction(void* pArg)
  功  能 : 线程启动函数
  参  数 : pArg -- 线程函数的参数
  返回值 : 线程的退出码
********************************************************************/
unsigned long WINAPI//__stdcall 
CWorkThread::ThreadFunction(void* pArg)
{
CWorkThread* thread = (CWorkThread*) pArg;


return thread->StartThread();
}


/********************************************************************
  函数名 : int StartThread(void)
  功  能 : 线程启动函数
  参  数 : None
  返回值 : 线程的退出码
********************************************************************/
int CWorkThread::StartThread(void)
{
m_pfnRoutine(m_pArg);


return (0);
}