#include <future> #include <utility> /* * Class that encapsulates promise and future object, * provides API to set exit signal for thread */ class Task { protected: std::promise<void> exitSignal; std::future<void> futureObj; public: Task() : futureObj(exitSignal.get_future()) {} Task(Task&& obj) : exitSignal(std::move(obj.exitSignal)), futureObj(std::move(obj.futureObj)) {} Task& operator=(Task&& obj) { exitSignal = std::move(obj.exitSignal); futureObj = std::move(obj.futureObj); return *this; } virtual void run_task() = 0; // thread function to be executed by thread void operator()() { run_task(); } bool stopRequested() { // checks if value in future object is available if (futureObj.wait_for(std::chrono::milliseconds(0)) == std::future_status::timeout) return false; return true; } // stop thread by setting value in promise object void stop() { exitSignal.set_value(); } };