diff options
Diffstat (limited to 'components/cplusplus/Thread.cpp')
| -rw-r--r-- | components/cplusplus/Thread.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/components/cplusplus/Thread.cpp b/components/cplusplus/Thread.cpp new file mode 100644 index 0000000000..4d2d8a59ea --- /dev/null +++ b/components/cplusplus/Thread.cpp @@ -0,0 +1,103 @@ +#include "Thread.h" + +using namespace rtthread; + +Thread::Thread(rt_uint32_t stack_size, + rt_uint8_t priority, + rt_uint32_t tick, + const char *name) +: _entry(RT_NULL), started(false) +{ + rt_event_init(&_event, name, 0); + + _thread = rt_thread_create(name, + (thread_func_t)func, + this, + stack_size, + priority, + tick); +} + +Thread::Thread(void (*entry)(void *p), + void *p, + rt_uint32_t stack_size, + rt_uint8_t priority, + rt_uint32_t tick, + const char *name) +: _entry(RT_NULL), started(false), _param(p) +{ + rt_event_init(&_event, name, 0); + + _thread = rt_thread_create(name, + (thread_func_t)func, + this, + stack_size, + priority, + tick); +} + +Thread::~Thread() +{ + rt_thread_delete(_thread); +} + +bool Thread::start() +{ + if (rt_thread_startup(_thread) == RT_EOK) + { + started = true; + } + + return started; +} + +void Thread::sleep(int32_t millisec) +{ + rt_int32_t tick; + + if (millisec < 0) + tick = 1; + else + tick = rt_tick_from_millisecond(millisec); + + rt_thread_delay(tick); +} + +void Thread::func(Thread *pThis) +{ + if (pThis->_entry != RT_NULL) + { + pThis->_entry(pThis->_param); + } + else + { + pThis->run(); + } + + rt_event_send(&pThis->_event, 1); +} + +void Thread::run() +{ + /* please overload this method */ +} + +void Thread::wait(int32_t millisec) +{ + join(millisec); +} + +void Thread::join(int32_t millisec) +{ + if (started) + { + rt_int32_t tick; + + if (millisec < 0) + tick = -1; + else + tick = rt_tick_from_millisecond(millisec); + + rt_event_recv(&_event, 1, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, tick, RT_NULL); + } +} |
