📄 osthread.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 + -