CRunnerTask

main
Yik Teng Hie 1 year ago
parent 22668b8b69
commit 224e33a209

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,90 @@
#pragma once
#include <thread>
#include <atomic>
#include <memory>
#include <queue>
#include <mutex>
#include <functional>
#include <stdexcept>
#include <iostream>
#include "DllDefines.h"
/*
* @link : https://www.cppstories.com/2019/12/threading-loopers-cpp17/
*/
using Runnable = std::function<void()>;
class UTILITYDLL CRunnerTask
{
// dispatch class
public:
using Runnable = std::function<void()>;
class CDispatcher
{
friend class CRunnerTask; // Allow the looper to access the private constructor.
public:
// Yet to be defined method, which will post the runnable
// into the looper-queue.
bool post(CRunnerTask::Runnable&& aRunnable)
{
return mAssignedRunner.post(std::move(aRunnable));
}
private: // construction, since we want the looper to expose it's dispatcher exclusively!
CDispatcher(CRunnerTask& aLooper)
: mAssignedRunner(aLooper)
{}
private:
// Store a reference to the attached looper in order to
// emplace tasks into the queue.
CRunnerTask& mAssignedRunner;
};
// ctor
CRunnerTask();
// Copy denied, Move to be implemented
~CRunnerTask();
// To be called, once the runner should start looping.
bool run();
void stop();
bool running() const;
Runnable next();
std::shared_ptr<CDispatcher> getDispatcher()
{
return mDispatcher;
}
private:
// Conditionally-infinite loop doing sth. iteratively
void runFunc();
// Shared implementation of exiting the loop-function and joining
// to the main thread.
void abortAndJoin();
bool post(Runnable&& aRunnable);
// attributes
std::thread mThread;
std::atomic_bool mRunning;
std::atomic_bool mAbortRequested;
//
std::recursive_mutex mRunnablesMutex;
std::queue<Runnable> mRunnables;
std::shared_ptr<CDispatcher> mDispatcher;
};

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save