CBaseThread类
BaseThread.h
// BaseThread.h: interface for the CBaseThread class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_) //#if !defined 防止重复定义
#define AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_
#if _MSC_VER > 1000
#pragma once //只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次
#endif // _MSC_VER > 1000
#include "BaseCallBack.h"
class CBaseThread
{
public:
CBaseThread();
virtual ~CBaseThread(); // 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。
DWORD Start(DWORD dwCreationFlags = 0);
virtual DWORD Stop(WORD timeout, BOOL bForceKill = FALSE);
DWORD Suspend();
DWORD Resume();
BOOL SetPriority(int nPriority);
int GetPriority();
void SetICallBack(CBaseCallBack* pCallBack) //函数指针 指向函数的首地址
{
this->m_pCallBack = pCallBack; //改变指向类的指针的指向
}
BOOL GetThreadRunState() const {return m_bRunThread;}
DWORD GetStartTime(){return m_dwStartTime;}
void ResetStartTime(){m_dwStartTime = GetTickCount();}
void SetStatisticalTime(DWORD dwTimeLen){m_dwStatisticalTime = dwTimeLen;}
DWORD GetStatisticalTime(){return m_dwStatisticalTime;}
protected:
virtual DWORD ThreadMethod() = 0; //纯虚函数
private:
static DWORD WINAPI ThreadFunc( LPVOID pParam);
public:
HANDLE m_hThread; //线程句柄
DWORD m_dwTID; //线程ID
DWORD m_dwExitCode; //线程退出码
DWORD m_dwStartTime;
DWORD m_dwStatisticalTime;
protected:
LPTHREAD_START_ROUTINE m_pThreadFunction; //工作线程指针
BOOL m_bRunThread; //线程是否继续运行的标志
CBaseCallBack *m_pCallBack; //指向类的指针
};
#endif // !defined(AFX_ADTHREAD_H__B8BA8873_31BA_4CDE_9BC2_45AD6FCDA5BD__INCLUDED_)
BaseThread.cpp
// ADThread.cpp: implementation of the CBaseThread class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BaseThread.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBaseThread::CBaseThread()
{
m_pThreadFunction = CBaseThread::ThreadFunc;
m_bRunThread = FALSE;
m_hThread = NULL;
}
CBaseThread::~CBaseThread()
{
if (m_hThread != NULL)
{
Stop(1000, true);
}
}
DWORD CBaseThread::Start(DWORD dwCreationFlags) //线程开始
{
m_bRunThread = true;
m_hThread = CreateThread(NULL, 0, m_pThreadFunction, this, dwCreationFlags, &m_dwTID); //创建线程
m_dwExitCode = (DWORD)-1;
ResetStartTime();
return GetLastError();
}
/************************************************************************/
/* 功能:停止线程
/* 参数:bForceKill,若TRUE,强制立即结束,否则,温柔结束
timeout:为等待时间,一毫秒记
/************************************************************************/
DWORD CBaseThread::Stop(WORD timeout, BOOL bForceKill) //线程停止
{
if (m_hThread != NULL)
{
//尝试"温柔地"结束线程
if (m_bRunThread)
{
m_bRunThread = FALSE;
WaitForSingleObject(m_hThread, timeout); //WaitForSingleObject()在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
}
GetExitCodeThread(m_hThread, &m_dwExitCode); //获取一个已中止线程的退出代码
if (m_dwExitCode == STILL_ACTIVE && bForceKill)
{
//强制杀死线程
TerminateThread(m_hThread, DWORD(-1)); //在线程外终止一个线程,用于强制终止线程 DWORD dwExitCode 退出码
m_hThread = NULL;
}
}
return m_dwExitCode;
}
/************************************************************************/
/*功能:挂起线程
/************************************************************************/
DWORD CBaseThread::Suspend()
{
return SuspendThread(m_hThread);
}
/************************************************************************/
/*功能:恢复线程
/************************************************************************/
DWORD CBaseThread::Resume()
{
return ResumeThread(m_hThread);
}
/************************************************************************/
/*功能:设置线程优先级
/*参数:priority:查看SetThreadPriority() in windows sdk,其可能取值。
/************************************************************************/
BOOL CBaseThread::SetPriority(int nPriority)
{
return SetThreadPriority(m_hThread, nPriority);
}
/************************************************************************/
/* 功能:获得线程优先级
/************************************************************************/
int CBaseThread::GetPriority()
{
return GetThreadPriority(m_hThread);
}
/************************************************************************/
/* 功能:静态线程函数, 调用实际的工作函数ThreadMethod()
/* 参数:pParam:在需要启用该线程函数的子类实例中,将this传给线程函数,以便线程函数可以访问该实例的成员。
/************************************************************************/
DWORD WINAPI CBaseThread::ThreadFunc(LPVOID pParam)
{
CBaseThread *pParent = reinterpret_cast<CBaseThread*>(pParam); //reinterpret_cast<type-id> (expression)强制类型转换符
//type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针
pParent->ThreadMethod(); //多态性,调用子类的实际工作函数
return 0;
}
BaseCallBack.h
// BaseCallBack.h: interface for the CBaseCallBack class.
//
//////////////////////////////////////////////////////////////////////
#ifndef _BASECALLBACK_H_
#define _BASECALLBACK_H_
typedef short I16;
class CBaseCallBack
{
public:
virtual ~CBaseCallBack(){}
virtual void CallBackMethod(short *psiBuf, DWORD dwSize) = 0;
virtual void CallBackMethod() = 0;
virtual void CallBackMethod(WPARAM wPara){;}
};
#endif
动力节点在线课程涵盖零基础入门,高级进阶,在职提升三大主力内容,覆盖Java从入门到就业提升的全体系学习内容。全部Java视频教程免费观看,相关学习资料免费下载!对于火爆技术,每周一定时更新!如果想了解更多相关技术,可以到动力节点在线免费观看Java多线程视频教程哦!
代码小兵64503-29 11:46
代码小兵87208-06 11:36
代码小兵34507-29 13:19