#pragma once // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DIOSTHREAD_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // DIOSTHREAD_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef DIOSTHREAD_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "Dios.Dev.ThreadX64D.lib") #else #pragma comment(lib, "Dios.Dev.ThreadX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "Dios.Dev.ThreadD.lib") #else #pragma comment(lib, "Dios.Dev.Thread.lib") #endif #endif #endif #ifdef DIOSTHREAD_EXPORTS #define DIOSTHREAD_API __declspec(dllexport) #else #define DIOSTHREAD_API __declspec(dllimport) #endif #include "DiosLock.h" #include "ResDataObject.h" #define MAX_CHECK_TIME_PERIOD (10000) //do not use this class directly //DiosThread must derived from Thread_Base //and rewrite Thread::Exec class DIOSTHREAD_API Thread_Base { protected: DWORD m_ThreadID; HANDLE m_Base_Thread; HANDLE m_ExitFlag; HANDLE m_WorkFlag; HANDLE m_RunFlag; virtual bool Exec(); virtual bool OnStartThread(); virtual bool OnEndThread(); HANDLE GetWorkEvt(); HANDLE GetExitEvt(); public: PVOID m_pThreadLogger; Thread_Base(void); virtual ~Thread_Base(void); void SetLogger(PVOID pLoger); PVOID GetLogger(); bool StartThread(bool Sync = true, bool Inherit = true); bool StopThread(DWORD timeperiod = 10000); void NotifyExit(); INT WaitTheIncommingEvent(DWORD waittime); bool WaitTheThreadEnd(DWORD waittime); bool WaitTheThreadEndSign(DWORD waittime);//for Exec Only bool WaitTheThreadOnTheRun(DWORD waittime); bool SetThreadOnTheRun(bool OnTheRun); void NotifyThreadWork(); DWORD GetTID(); void ThreadExitProcedure(); private: static DWORD WINAPI Thread_Base_Thread(LPVOID pPara); }; class DIOSTHREAD_API Work_Thread : public Thread_Base,public DiosLock { protected: HANDLE m_PauseEvt; HANDLE m_SleepingEvt; HANDLE m_ResumeEvt; HANDLE m_WorkingEvt;//双方确认结束交互 HANDLE m_pWorkQueReq;//request HANDLE m_pWorkQueRes;//response bool PopReqDataObject(ResDataObject &obj); bool PopResDataObject(ResDataObject &obj); bool WaitForInQue(DWORD m_Timeout = INFINITE); bool CheckForPause(); bool WaitforResume(); public: Work_Thread(void); virtual ~Work_Thread(void); //work bool PushReqDataObject(ResDataObject &obj); bool PushResDataObject(ResDataObject &obj); bool PauseThread(DWORD timeout = INFINITE); bool ResumeThread(DWORD timeout = INFINITE); }; class DIOSTHREAD_API Dios_Thread : public Thread_Base { public: Dios_Thread(void); virtual ~Dios_Thread(void); protected: }; #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