#pragma once #include #include #include #include #include #include #define CcosTHREAD_API #include "CcosLock.h" #include "ResDataObject.h" #include "LinuxEvent.h" #define MAX_CHECK_TIME_PERIOD (10000) typedef void* PVOID; class CcosTHREAD_API Thread_Base { protected: pthread_t m_Base_Thread; unsigned long m_ThreadID; std::shared_ptr m_ExitFlag; std::shared_ptr m_WorkFlag; std::shared_ptr m_RunFlag; bool m_ThreadRunning; bool m_ExitRequested; pthread_cond_t m_StateCond; std::string m_strName; PVOID m_pThreadLogger; virtual bool Exec(); virtual bool OnStartThread(); virtual bool OnEndThread(); std::shared_ptr GetWorkEvt(); std::shared_ptr GetExitEvt(); static void* Thread_Base_Thread(void* pPara); public: Thread_Base(); virtual ~Thread_Base(); void SetLogger(PVOID pLoger); PVOID GetLogger(); bool StartThread(bool Sync = true, bool Inherit = true); bool StopThread(unsigned long timeperiod = 10000); void NotifyExit(); int WaitTheIncommingEvent(unsigned long waittime); bool WaitTheThreadEnd(unsigned long waittime); bool WaitTheThreadEndSign(unsigned long waittime); bool RegistThread(); bool UnRegistThread(); bool WaitTheThreadOnTheRun(unsigned long waittime); bool SetThreadOnTheRun(bool OnTheRun); void NotifyThreadWork(); pthread_t GetTID(); void SetName(const char* pszThreadName); void ThreadExitProcedure(); }; class CcosTHREAD_API Work_Thread : public Thread_Base, public CcosLock { protected: std::shared_ptr m_PauseEvt; std::shared_ptr m_SleepingEvt; std::shared_ptr m_ResumeEvt; std::shared_ptr m_WorkingEvt;//双方确认结束交互 void* m_pWorkQueReq;//request void* m_pWorkQueRes;//response bool PopReqDataObject(ResDataObject& obj); bool PopResDataObject(ResDataObject& obj); bool WaitForInQue(unsigned long m_Timeout = (unsigned long)-1); bool CheckForPause(); bool WaitforResume(); public: Work_Thread(); virtual ~Work_Thread(); bool PushReqDataObject(ResDataObject& obj); bool PushResDataObject(ResDataObject& obj); bool PauseThread(unsigned long timeout = (unsigned long)-1); bool ResumeThread(unsigned long timeout = (unsigned long)-1); }; class CcosTHREAD_API Ccos_Thread : public Thread_Base { public: Ccos_Thread(); virtual ~Ccos_Thread(); }; #define WAITROUTINE(x) { \ int ret = WaitTheIncommingEvent(x); \ if(ret == 0) return false; \ if(ret == -1) return true; \ } #define WAIT(p, time) if(p->WaitTheThreadEndSign(time)) #define WAITRETURN(p, time, ret) if(p->WaitTheThreadEndSign(time)) return ret #define WAITRETURNVOID(p, time) if(p->WaitTheThreadEndSign(time)) return