CcosThread.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. virtual bool RegistThread();
  30. virtual bool UnRegistThread();
  31. std::shared_ptr<LinuxEvent> GetWorkEvt();
  32. std::shared_ptr<LinuxEvent> GetExitEvt();
  33. static void* Thread_Base_Thread(void* pPara);
  34. public:
  35. Thread_Base();
  36. virtual ~Thread_Base();
  37. void SetLogger(PVOID pLoger);
  38. PVOID GetLogger();
  39. bool StartThread(bool Sync = true, bool Inherit = false);
  40. bool StopThread(unsigned long timeperiod = 10000);
  41. void NotifyExit();
  42. pthread_t GetTID();
  43. void SetName(const char* pszThreadName);
  44. const std::string& GetName() const { return m_strName; }
  45. int WaitTheIncommingEvent(unsigned long waittime = (unsigned long)-1);
  46. bool WaitTheThreadEnd(unsigned long waittime = (unsigned long)-1);
  47. bool WaitTheThreadEndSign(unsigned long waittime = (unsigned long)-1);
  48. bool WaitTheThreadOnTheRun(unsigned long waittime = (unsigned long)-1);
  49. bool SetThreadOnTheRun(bool OnTheRun);
  50. void NotifyThreadWork();
  51. bool IsThreadRunning() const { return m_ThreadRunning; }
  52. void ThreadExitProcedure();
  53. };
  54. class CcosTHREAD_API Work_Thread : public Thread_Base, public CcosLock {
  55. protected:
  56. std::shared_ptr<LinuxEvent> m_PauseEvt;
  57. std::shared_ptr<LinuxEvent> m_SleepingEvt;
  58. std::shared_ptr<LinuxEvent> m_ResumeEvt;
  59. std::shared_ptr<LinuxEvent> m_WorkingEvt;//Ë«·½È·ÈϽáÊø½»»¥
  60. void* m_pWorkQueReq;//request
  61. void* m_pWorkQueRes;//response
  62. bool PopReqDataObject(ResDataObject& obj);
  63. bool PopResDataObject(ResDataObject& obj);
  64. bool WaitForInQue(unsigned long m_Timeout = (unsigned long)-1);
  65. bool CheckForPause();
  66. bool WaitforResume();
  67. public:
  68. Work_Thread();
  69. virtual ~Work_Thread();
  70. bool PushReqDataObject(ResDataObject& obj);
  71. bool PushResDataObject(ResDataObject& obj);
  72. bool PauseThread(unsigned long timeout = (unsigned long)-1);
  73. bool ResumeThread(unsigned long timeout = (unsigned long)-1);
  74. };
  75. class CcosTHREAD_API Ccos_Thread : public Thread_Base {
  76. public:
  77. Ccos_Thread();
  78. virtual ~Ccos_Thread();
  79. };
  80. #define WAITROUTINE(x) { \
  81. int ret = WaitTheIncommingEvent(x); \
  82. if(ret == 0) return false; \
  83. if(ret == -1) return true; \
  84. }
  85. #define WAIT(p, time) if(p->WaitTheThreadEndSign(time))
  86. #define WAITRETURN(p, time, ret) if(p->WaitTheThreadEndSign(time)) return ret
  87. #define WAITRETURNVOID(p, time) if(p->WaitTheThreadEndSign(time)) return