#ifndef OPENPOSE_THREAD_WORKER_HPP #define OPENPOSE_THREAD_WORKER_HPP #include namespace op { template class Worker { public: Worker(); virtual ~Worker(); void initializationOnThreadNoException(); bool checkAndWork(TDatums& tDatums); inline bool isRunning() const { return mIsRunning; } inline void stop() { mIsRunning = false; } // Virtual in case some function needs special stopping (e.g., buffers might not stop immediately and need a // few iterations) inline virtual void tryStop() { stop(); } protected: virtual void initializationOnThread() = 0; virtual void work(TDatums& tDatums) = 0; private: bool mIsRunning; DELETE_COPY(Worker); }; } // Implementation namespace op { template Worker::Worker() : mIsRunning{true} { } template Worker::~Worker() { } template void Worker::initializationOnThreadNoException() { try { this->initializationOnThread(); } catch (const std::exception& e) { this->stop(); errorWorker(e.what(), __LINE__, __FUNCTION__, __FILE__); } } template bool Worker::checkAndWork(TDatums& tDatums) { try { if (mIsRunning) work(tDatums); return mIsRunning; } catch (const std::exception& e) { this->stop(); errorWorker(e.what(), __LINE__, __FUNCTION__, __FILE__); return false; } } COMPILE_TEMPLATE_DATUM(Worker); } #endif // OPENPOSE_THREAD_WORKER_HPP