hthread.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifndef H_THREAD_H
  2. #define H_THREAD_H
  3. #include "hdef.h"
  4. #include "hplatform.h"
  5. #include "htime.h" // for msleep
  6. #include <thread>
  7. #include <atomic>
  8. #ifdef _MSC_VER
  9. inline uint32 getpid(){
  10. return GetCurrentProcessId();
  11. }
  12. #endif
  13. inline uint32 gettid(){
  14. #ifdef _MSC_VER
  15. return GetCurrentThreadId();
  16. #else
  17. return pthread_self();
  18. #endif
  19. }
  20. /************************************************
  21. * HThread
  22. * Status: STOP,RUNNING,PAUSE
  23. * Control: start,stop,pause,resume
  24. * first-level virtual: doTask
  25. * second-level virtual: run
  26. ************************************************/
  27. class HThread{
  28. public:
  29. HThread() {
  30. status = STOP;
  31. }
  32. virtual ~HThread() {
  33. }
  34. virtual int start() {
  35. if (status == STOP) {
  36. status = RUNNING;
  37. thread = std::thread(&HThread::thread_proc, this);
  38. }
  39. return 0;
  40. }
  41. virtual int stop() {
  42. if (status != STOP) {
  43. status = STOP;
  44. thread.join(); // wait thread exit
  45. }
  46. return 0;
  47. }
  48. virtual int pause() {
  49. if (status == RUNNING) {
  50. status = PAUSE;
  51. }
  52. return 0;
  53. }
  54. virtual int resume() {
  55. if (status == PAUSE) {
  56. status = RUNNING;
  57. }
  58. return 0;
  59. }
  60. void thread_proc() {
  61. doPrepare();
  62. run();
  63. doFinish();
  64. }
  65. virtual void run() {
  66. while (status != STOP) {
  67. if (status == PAUSE) {
  68. msleep(1);
  69. continue;
  70. }
  71. doTask();
  72. msleep(1);
  73. }
  74. }
  75. virtual void doPrepare() {}
  76. virtual void doTask() {}
  77. virtual void doFinish() {}
  78. std::thread thread;
  79. enum Status {
  80. STOP,
  81. RUNNING,
  82. PAUSE,
  83. };
  84. std::atomic<Status> status;
  85. };
  86. #endif // H_THREAD_H