Thread.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "Thread.h"
  2. using namespace rtthread;
  3. Thread::Thread(rt_uint32_t stack_size,
  4. rt_uint8_t priority,
  5. rt_uint32_t tick,
  6. const char *name)
  7. : _entry(RT_NULL), _param(RT_NULL), started(false)
  8. {
  9. rt_event_init(&_event, name, 0);
  10. _thread = rt_thread_create(name,
  11. (thread_func_t)func,
  12. this,
  13. stack_size,
  14. priority,
  15. tick);
  16. }
  17. Thread::Thread(void (*entry)(void *p),
  18. void *p,
  19. rt_uint32_t stack_size,
  20. rt_uint8_t priority,
  21. rt_uint32_t tick,
  22. const char *name)
  23. : _entry(RT_NULL), _param(p), started(false)
  24. {
  25. rt_event_init(&_event, name, 0);
  26. _thread = rt_thread_create(name,
  27. (thread_func_t)func,
  28. this,
  29. stack_size,
  30. priority,
  31. tick);
  32. }
  33. Thread::~Thread()
  34. {
  35. rt_thread_delete(_thread);
  36. }
  37. bool Thread::start()
  38. {
  39. if (rt_thread_startup(_thread) == RT_EOK)
  40. {
  41. started = true;
  42. }
  43. return started;
  44. }
  45. void Thread::sleep(int32_t millisec)
  46. {
  47. rt_int32_t tick;
  48. if (millisec < 0)
  49. tick = 1;
  50. else
  51. tick = rt_tick_from_millisecond(millisec);
  52. rt_thread_delay(tick);
  53. }
  54. void Thread::func(Thread *pThis)
  55. {
  56. if (pThis->_entry != RT_NULL)
  57. {
  58. pThis->_entry(pThis->_param);
  59. }
  60. else
  61. {
  62. pThis->run();
  63. }
  64. rt_event_send(&pThis->_event, 1);
  65. }
  66. void Thread::run()
  67. {
  68. /* please overload this method */
  69. }
  70. void Thread::wait(int32_t millisec)
  71. {
  72. join(millisec);
  73. }
  74. void Thread::join(int32_t millisec)
  75. {
  76. if (started)
  77. {
  78. rt_int32_t tick;
  79. if (millisec < 0)
  80. tick = -1;
  81. else
  82. tick = rt_tick_from_millisecond(millisec);
  83. rt_event_recv(&_event, 1, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, tick, RT_NULL);
  84. }
  85. }