163 lines
5.0 KiB
C
163 lines
5.0 KiB
C
|
|
#ifndef _WYL_THREAD_H_
|
|||
|
|
#define _WYL_THREAD_H_
|
|||
|
|
|
|||
|
|
/******************************************************************
|
|||
|
|
*
|
|||
|
|
* wyLib库 2008 - 2010
|
|||
|
|
*
|
|||
|
|
* $ 线程基础类 $
|
|||
|
|
*
|
|||
|
|
* - 主要功能 -
|
|||
|
|
*
|
|||
|
|
* 实现线程的基本封装操作。支持暂停、恢复线程,等待线程以及设
|
|||
|
|
* 置线程优先级等基本操作。
|
|||
|
|
* 2013-10-22 修改:
|
|||
|
|
1、母线程启动子线程的时候,自身休眠,需要等子线程启动完毕以后,唤醒母线程;
|
|||
|
|
2、在关闭线程的时候,子线程完全退出以后,唤醒母线程,将外边的线程调用全部整合到一起;
|
|||
|
|
*****************************************************************/
|
|||
|
|
|
|||
|
|
#include "_osdef.h"
|
|||
|
|
namespace wylib
|
|||
|
|
{
|
|||
|
|
namespace thread
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
#ifdef WIN32
|
|||
|
|
#define THREAD_HANDLE HANDLE
|
|||
|
|
#else
|
|||
|
|
#define THREAD_HANDLE pthread_t
|
|||
|
|
typedef void*( *thread_proc)(void*);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/* 线程基础类
|
|||
|
|
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
class CBaseThread
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
//线程的回调函数,在linux和windows下的实现
|
|||
|
|
typedef void (*THREAD_CALLBACK)( void*) ;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
THREAD_HANDLE m_hThread; //自身的线程句柄
|
|||
|
|
|
|||
|
|
volatile long m_boWorking; //是否已经启动了,如果没有启动,需要
|
|||
|
|
|
|||
|
|
volatile long m_boHasStoped; //是否已经停止了
|
|||
|
|
|
|||
|
|
#ifndef WIN32
|
|||
|
|
pthread_cond_t m_Cond;
|
|||
|
|
pthread_mutex_t m_Mutex;
|
|||
|
|
volatile bool m_boSuspend;
|
|||
|
|
#else
|
|||
|
|
volatile HANDLE m_hWorkThreadEvent ; //用于线程同步的事件
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
DWORD m_dwThreadId; //线程ID
|
|||
|
|
char m_threadName[64]; //线程的名字
|
|||
|
|
THREAD_CALLBACK m_callFun; //调用函数
|
|||
|
|
void * m_pCallBackData; //回调参数
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
|
|||
|
|
THREAD_HANDLE CreateThreadHandle(const DWORD dwFlags);
|
|||
|
|
|
|||
|
|
|
|||
|
|
//启动线程的时候调用
|
|||
|
|
//static void OnStartThread(void *lpThread);
|
|||
|
|
|
|||
|
|
#ifdef WIN32
|
|||
|
|
static unsigned int CALLBACK ThreadRoutine(void *lpThread);
|
|||
|
|
#else
|
|||
|
|
static void* ThreadRoutine(void * lpThread);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//terminated函数用于判断现成是否被设置了终止标记
|
|||
|
|
inline bool terminated(){ return m_boWorking ? false:true; }
|
|||
|
|
|
|||
|
|
|
|||
|
|
//线程启动了
|
|||
|
|
virtual void OnThreadStarted(){}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//实时调用,每次调用
|
|||
|
|
virtual void OnRountine() ;
|
|||
|
|
|
|||
|
|
//线程被终止后的通知函数,nSuspendCount参数表示线程被终止的次数
|
|||
|
|
virtual void OnSuspend(int nSuspendCount);
|
|||
|
|
|
|||
|
|
//线程被恢复后的通知函数,nSuspendCount参数表示线程还需恢复多少次后才能恢复执行,为0表示线程已恢复执行
|
|||
|
|
virtual void OnResume(int nSuspendCount);
|
|||
|
|
|
|||
|
|
//线程例程终止后的通知函数
|
|||
|
|
virtual void OnTerminated();
|
|||
|
|
public:
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments: 线程类的构造函数,支持2种方式构造线程,一个是继承本类,一种是传调用函数和参数进来,在构造函数中,不会启动线程,需要显示调用StartWorkThread
|
|||
|
|
* Parameter: char * sThreadName:线程的名字,用于调试
|
|||
|
|
* Parameter: THREAD_CALLBACK callFun:回调函数,如果不使用,就使用OnRountine调用,否则使用 callFun(pData)
|
|||
|
|
* Parameter: void * pData:如果callFun不为空的时候,是用户自己设置的调用函数,这个时候,运行附加一个参数pData
|
|||
|
|
* @Return :
|
|||
|
|
*/
|
|||
|
|
CBaseThread(char *sThreadName ="Thread",THREAD_CALLBACK callFun=NULL,void * pData =NULL );
|
|||
|
|
|
|||
|
|
|
|||
|
|
~CBaseThread();
|
|||
|
|
|
|||
|
|
//线程正式开始工作
|
|||
|
|
void StartWorkThread();
|
|||
|
|
|
|||
|
|
//停止工作
|
|||
|
|
void StopWorkThread();
|
|||
|
|
|
|||
|
|
|
|||
|
|
//获取线程句柄
|
|||
|
|
inline THREAD_HANDLE getHandle(){ return m_hThread; }
|
|||
|
|
|
|||
|
|
//获取线程ID
|
|||
|
|
inline DWORD getThreadId(){ return m_dwThreadId; }
|
|||
|
|
|
|||
|
|
//获取线程的名字
|
|||
|
|
inline char *GetThreadName() {return m_threadName;}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#ifndef WIN32
|
|||
|
|
// 启动时候是否需要挂起。因为linux没有此线程api,只能手动挂起,兼容wylib的window特性
|
|||
|
|
inline bool isSuspend(){return m_boSuspend;}
|
|||
|
|
#endif
|
|||
|
|
//暂停线程的执行,返回值表示线程到本次暂停操作后为止总计被暂停的次数。若返回-1则表示暂停线程失败。
|
|||
|
|
int suspend();
|
|||
|
|
|
|||
|
|
//恢复线程的执行,返回值表示线程到本次恢复操作后,线程仍需恢复多少次才能恢复执行。
|
|||
|
|
//若返回-1则表示恢复线程失败,返回0表示线程已经完全恢复执行。
|
|||
|
|
int resume();
|
|||
|
|
|
|||
|
|
//获取线程优先级,失败会返回THREAD_PRIORITY_ERROR_RETURN,否则返回值表示线程优先级
|
|||
|
|
int getPriority();
|
|||
|
|
|
|||
|
|
//设置线程优先级,成功则返回true
|
|||
|
|
bool setPriority(int nPriority);
|
|||
|
|
|
|||
|
|
//等待线程执行完毕,dwWaitLong参数表示等待的最大毫秒数,INFINITE表示无限等待。
|
|||
|
|
//注意,调用此函数的线程在此线程执行完毕后会一直处于阻塞状态
|
|||
|
|
//参数boWaitAlertAble表示调用线程在阻塞期间是否允许进入警告状态(仅对于windows有效)
|
|||
|
|
#ifdef WIN32
|
|||
|
|
int waitFor(DWORD dwWaitLong = INFINITE, bool boWaitAlertAble = true);
|
|||
|
|
#else
|
|||
|
|
int waitFor(DWORD dwWaitLong = 0, bool boWaitAlertAble = true);
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//标记线程的终止标记
|
|||
|
|
void terminate();
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|