CcosThread.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #pragma once
  2. #include <pthread.h>
  3. #include <semaphore.h>
  4. #include <unistd.h>
  5. #include <string>
  6. #include <queue>
  7. #include <sys/types.h>
  8. #define CcosTHREAD_API
  9. #include "CcosLock.h"
  10. #include "ResDataObject.h"
  11. #include "LinuxEvent.h"
  12. #define MAX_CHECK_TIME_PERIOD (10000)
  13. typedef void* PVOID;
  14. class CcosTHREAD_API Thread_Base {
  15. protected:
  16. pthread_t m_Base_Thread;
  17. unsigned long m_ThreadID;
  18. std::shared_ptr<LinuxEvent> m_ExitFlag;
  19. std::shared_ptr<LinuxEvent> m_WorkFlag;
  20. std::shared_ptr<LinuxEvent> m_RunFlag;
  21. bool m_ThreadRunning;
  22. bool m_ExitRequested;
  23. pthread_cond_t m_StateCond;
  24. std::string m_strName;
  25. PVOID m_pThreadLogger;
  26. virtual bool Exec();
  27. virtual bool OnStartThread();
  28. virtual bool OnEndThread();
  29. std::shared_ptr<LinuxEvent> GetWorkEvt();
  30. std::shared_ptr<LinuxEvent> GetExitEvt();
  31. static void* Thread_Base_Thread(void* pPara);
  32. public:
  33. Thread_Base();
  34. virtual ~Thread_Base();
  35. void SetLogger(PVOID pLoger);
  36. PVOID GetLogger();
  37. bool StartThread(bool Sync = true, bool Inherit = true);
  38. bool StopThread(unsigned long timeperiod = 10000);
  39. void NotifyExit();
  40. int WaitTheIncommingEvent(unsigned long waittime);
  41. bool WaitTheThreadEnd(unsigned long waittime);
  42. bool WaitTheThreadEndSign(unsigned long waittime);
  43. bool RegistThread();
  44. bool UnRegistThread();
  45. bool WaitTheThreadOnTheRun(unsigned long waittime);
  46. bool SetThreadOnTheRun(bool OnTheRun);
  47. void NotifyThreadWork();
  48. pthread_t GetTID();
  49. void SetName(const char* pszThreadName);
  50. void ThreadExitProcedure();
  51. };
  52. class CcosTHREAD_API Work_Thread : public Thread_Base, public CcosLock {
  53. protected:
  54. std::shared_ptr<LinuxEvent> m_PauseEvt;
  55. std::shared_ptr<LinuxEvent> m_SleepingEvt;
  56. std::shared_ptr<LinuxEvent> m_ResumeEvt;
  57. std::shared_ptr<LinuxEvent> m_WorkingEvt;//Ë«·½È·ÈϽáÊø½»»¥
  58. void* m_pWorkQueReq;//request
  59. void* m_pWorkQueRes;//response
  60. bool PopReqDataObject(ResDataObject& obj);
  61. bool PopResDataObject(ResDataObject& obj);
  62. bool WaitForInQue(unsigned long m_Timeout = (unsigned long)-1);
  63. bool CheckForPause();
  64. bool WaitforResume();
  65. public:
  66. Work_Thread();
  67. virtual ~Work_Thread();
  68. bool PushReqDataObject(ResDataObject& obj);
  69. bool PushResDataObject(ResDataObject& obj);
  70. bool PauseThread(unsigned long timeout = (unsigned long)-1);
  71. bool ResumeThread(unsigned long timeout = (unsigned long)-1);
  72. };
  73. class CcosTHREAD_API Ccos_Thread : public Thread_Base {
  74. public:
  75. Ccos_Thread();
  76. virtual ~Ccos_Thread();
  77. };
  78. #define WAITROUTINE(x) { \
  79. int ret = WaitTheIncommingEvent(x); \
  80. if(ret == 0) return false; \
  81. if(ret == -1) return true; \
  82. }
  83. #define WAIT(p, time) if(p->WaitTheThreadEndSign(time))
  84. #define WAITRETURN(p, time, ret) if(p->WaitTheThreadEndSign(time)) return ret
  85. #define WAITRETURNVOID(p, time) if(p->WaitTheThreadEndSign(time)) return