| #ifndef OPENPOSE_THREAD_SUB_THREAD_HPP |
| #define OPENPOSE_THREAD_SUB_THREAD_HPP |
|
|
| #include <openpose/core/common.hpp> |
| #include <openpose/thread/worker.hpp> |
|
|
| namespace op |
| { |
| template<typename TDatums, typename TWorker = std::shared_ptr<Worker<TDatums>>> |
| class SubThread |
| { |
| public: |
| explicit SubThread(const std::vector<TWorker>& tWorkers); |
|
|
| |
| virtual ~SubThread(); |
|
|
| void initializationOnThread(); |
|
|
| virtual bool work() = 0; |
|
|
| protected: |
| inline size_t getTWorkersSize() const |
| { |
| return mTWorkers.size(); |
| } |
|
|
| bool workTWorkers(TDatums& tDatums, const bool inputIsRunning); |
|
|
| private: |
| std::vector<TWorker> mTWorkers; |
|
|
| DELETE_COPY(SubThread); |
| }; |
| } |
|
|
|
|
|
|
|
|
|
|
| |
| namespace op |
| { |
| template<typename TDatums, typename TWorker> |
| SubThread<TDatums, TWorker>::SubThread(const std::vector<TWorker>& tWorkers) : |
| mTWorkers{tWorkers} |
| { |
| } |
|
|
| template<typename TDatums, typename TWorker> |
| SubThread<TDatums, TWorker>::~SubThread() |
| { |
| } |
|
|
| template<typename TDatums, typename TWorker> |
| bool SubThread<TDatums, TWorker>::workTWorkers(TDatums& tDatums, const bool inputIsRunning) |
| { |
| try |
| { |
| |
| if (!inputIsRunning) |
| { |
| for (auto& tWorkers : mTWorkers) |
| { |
| tWorkers->tryStop(); |
| if (tWorkers->isRunning()) |
| break; |
| } |
| } |
|
|
| |
| if ((*mTWorkers.crbegin())->isRunning()) |
| { |
| |
| auto allRunning = true; |
| auto lastOneStopped = false; |
| for (auto& worker : mTWorkers) |
| { |
| if (lastOneStopped) |
| worker->tryStop(); |
|
|
| if (!worker->checkAndWork(tDatums)) |
| { |
| allRunning = false; |
| lastOneStopped = true; |
| } |
| else |
| lastOneStopped = false; |
| } |
|
|
| if (allRunning) |
| return true; |
| else |
| { |
| |
| |
| auto lastRunning = (*mTWorkers.crbegin())->isRunning(); |
| if (lastRunning) |
| { |
| |
| auto lastIndexNotRunning = 0ull; |
| for (auto i = mTWorkers.size() - 1 ; i > 0 ; i--) |
| { |
| if (!mTWorkers[i]->checkAndWork(tDatums)) |
| { |
| lastIndexNotRunning = i; |
| break; |
| } |
| } |
|
|
| |
| for (auto i = 0ull; i < lastIndexNotRunning ; i++) |
| mTWorkers[i]->stop(); |
|
|
| |
| lastRunning = false; |
| for (auto i = lastIndexNotRunning+1; i < mTWorkers.size() ; i++) |
| { |
| mTWorkers[i]->tryStop(); |
| if (mTWorkers[i]->isRunning()) |
| { |
| lastRunning = true; |
| break; |
| } |
| } |
| } |
| return lastRunning; |
| } |
| } |
| else |
| return false; |
| } |
| catch (const std::exception& e) |
| { |
| error(e.what(), __LINE__, __FUNCTION__, __FILE__); |
| return false; |
| } |
| } |
|
|
| template<typename TDatums, typename TWorker> |
| void SubThread<TDatums, TWorker>::initializationOnThread() |
| { |
| try |
| { |
| for (auto& tWorker : mTWorkers) |
| tWorker->initializationOnThreadNoException(); |
| } |
| catch (const std::exception& e) |
| { |
| error(e.what(), __LINE__, __FUNCTION__, __FILE__); |
| } |
| } |
|
|
| COMPILE_TEMPLATE_DATUM(SubThread); |
| } |
|
|
| #endif |
|
|