⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osthread.h

📁 跨操作系统的微型中间件
💻 H
字号:
/*    File:       OSThread.h    Contains:   A thread abstraction   */#ifndef __OSTHREAD__#define __OSTHREAD__#ifndef __Win32__	#if __solaris__ || __sgi__ || __hpux__    	#include <errno.h>	#else    	#include <sys/errno.h>	#endif    #include <pthread.h>#endif#include <queue>#include <list>#include <string>#include "OSHeaders.h"#include "OSCond.h"#include "Event.h"using namespace std;//Task的消息类型#define RFS_MSG_NORNALQUIT		0x00000001 //正常退出消息#define RFS_MSG_TIMEOUT			0x00000002 //超时消息#define CLASSNAME_SIZE	100class OSThreadPool;class OSThread;class OSTask :public CEvent{	friend class OSThread;public:	enum prio	{			k_prio_low		=	1,			k_prio_normal	=	2,			k_prio_high		=	3	};protected:	//OSTask的执行函数, 执行具体的任务	virtual Bool Run() = 0;	public:	//初始化OSTask对象	virtual Bool Initialize() {return TRUE;};	//复位OSTask对象, 一般是在停止运行, 但又不删除对象时,	//对Task对象进行一些复位操作	virtual void Reset() {};//	//销毁OSTask对象//	virtual Bool Destroy() { return TRUE; };		//使任务运行	Bool RunTask();			//使任务停止运行, 如是自动删除属性删除对象, 将导致	//对象被删除, 如是非自动删除属性, 则仅停止运行	void StopTask();		//停止运行并删除任务对象, 如果对象是非自动删除属性,	//必须由此析构, 如是自动删除属性也可由此删除.	void DeleteTask();			Bool IsRunning()	{		OSMutexLocker Locker(&m_isRunningMutex);		return m_isRunning;	}	//发送消息	Bool PostMessage(UInt32 v_MsgID,CEvent *v_MsgRecvObj=NULL,Int32 v_Value=0,UInt32 v_PrioID = k_prio_normal);	protected:	OSTask();	virtual ~OSTask();	//	void DetachFromThread();	//设为非自动删除	void SetNonAutoDelete();	void SetAutoDelete();		//从消息队列中弹出消息	Bool PopMessage(MsgData* v_msgData);	UInt32	GetMsgQueueSize();		UInt32	GetTaskID() { return m_TaskID; }protected:	string	m_strTaskType;private:	priority_queue<MsgData,vector<MsgData>,MsgData> m_MsgQueue;	OSMutex m_Mutex_MsgQueue;		Bool	m_isRunning;	OSMutex	m_isRunningMutex;	OSCond	m_isRunningCond;	UInt32	m_TaskID;	static	OSMutex	m_mtxIDCalclator;	static	UInt32 m_IDCalclator;};class OSThread{	friend class OSThreadPool;public:                    OSThread(UInt32 v_StackSize = 1024);    virtual			~OSThread();    	Bool SetTask(OSTask* v_Task);	Bool Start();	void Stop();	Bool Active();	const THREAD_ID GetThreadID()	{ return m_ThreadID; }protected:	void* Entry();private:#ifdef __Win32__    static unsigned int WINAPI _Entry(LPVOID inThread);#else    static void*        _Entry(void* inThread);#endif	Bool Join(THREAD_ID hJoinedThreadID);	private:	UInt32	m_StackSize;	OSCond 	m_Cond_Run;		OSMutex 	m_Mutex_Run;	Bool		m_IsTaskRun;	OSCond	m_IsTaskRunCond;	OSMutex	m_IsTaskRunMutex;	Bool 		m_run;	Bool 		m_busy;	OSTask* 	m_Task;   	Bool 		fStopRequested;   	Bool 		fJoined;		//线程的ID号    THREAD_ID	m_ThreadID;#ifdef __linux__    pthread_attr_t	m_ThreadAttr;#endif#ifdef WIN32	// 帮助退出,因为Dll调用的时候,WaitForSingleObject(threadHandle,xx)有问题,暂时采用这种的方式	HANDLE		m_EventHandle;#endifpublic:#ifdef WIN32	// 帮助退出,因为Dll调用的时候,WaitForSingleObject(threadHandle,xx)有问题,暂时采用这种的方式	void		SendQuitEvent();#endif	};class OSThreadPool{	friend class OSTask;private:	OSThreadPool();	~OSThreadPool();	static Bool RegistTask(OSTask* v_Task);public:	static OSThreadPool* GetInstance();	static Bool DestroyInstance();	static Bool Initialize(UInt32 v_ThreadNum,UInt32 v_StackSize);	static Bool ReclaimThread(OSThread* v_Thread);	static void PrintUsedThreadInfo();private:	//所有Thread的链表	static list<OSThread*> m_ThreadList;	//使用链表	static list<OSThread*> m_UseList;	//未使用链表	static list<OSThread*> m_UnuseList;	//Locker for all list	static OSMutex m_ListMutex;	//线程数量	static UInt32 m_ThreadNum;	//线程Stack大小	static UInt32 m_StackSize;	//全局实例	static OSThreadPool* m_OSThreadPool;};extern OSThreadPool* g_ThreadPool;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -