С пару месяцев назад пробовал, всё что мог, в новом C++ 11. Это header для некоего подобия cron. Action есть назначается ScheduleItem, который хранится по значению в векторе, но при копировании ScheduleItem, Action перемещается. A bit complicated, но вот хотелось подменять Action "на лету". В приниципе можно было организовать вместо std::vector<ScheduleItem> m_vctSchedule; какой-то std::vector< unique_ptr<ScheduleItem> > m_vctSchedule; Ну или take care of Action while copying ScheduleItem, который имеет unique_ptr<Action>.crypto5 wrote: Да, код обычно проясняет все абстрактные ворпосы.
Code: Select all
#include <string>
#include <atomic>
#include <mutex>
#include <vector>
#include <ctime>
#include <chrono>
#include <memory>
#include <future>
#include <functional>
#include <condition_variable>
namespace cpp11_fubar
{
class SchedulerControlInterface
{
public:
virtual void stop() = 0;
// virtual void notify_complete() = 0;
};
struct Result
{
typedef enum
{
WaitingOnStart,
Started,
FinishedOk,
Terminated,
FailedToStart
}
completionCode;
Result(completionCode code = WaitingOnStart) : m_completionCode(code) {}
const completionCode getCompletion() {return m_completionCode;}
const std::string getInfo() {return m_info;}
completionCode m_completionCode;
std::string m_info;
};
typedef SchedulerControlInterface* SI;
class Action
{
public:
Action(const std::string& info, std::function<void (SI)> function) :
m_info(info), m_function(function) {}
std::function<void (SI)> m_function;
const Result& getResult() {return m_result;}
void setResultCode(Result::completionCode code) {m_result.m_completionCode = code;}
void setResultInfo(const std::string& info) {m_result.m_info = info;}
std::string getResultInfo() {return m_info;};
protected:
Result m_result;
std::string m_info;
};
class ScheduleItem
{
public:
ScheduleItem(std::chrono::time_point<std::chrono::system_clock> pt, Action* action) :
m_point_in_time(pt), m_action(action) {}
std::chrono::time_point<std::chrono::system_clock> m_point_in_time;
std::unique_ptr<Action> m_action;
// move constructor
ScheduleItem(ScheduleItem&& item) {operator=(item);}
// copy constructor does 'move' too
ScheduleItem(const ScheduleItem& item) {operator=(const_cast<ScheduleItem&>(item));}
// copy operator (acts as move for unique_ptr)
ScheduleItem& operator=(ScheduleItem& item)
{
// dealing with move for unique_ptr
m_action = std::move(item.m_action);
m_point_in_time = item.m_point_in_time;
return *this;
}
};
class Scheduler : public SchedulerControlInterface
{
public:
Scheduler();
virtual ~Scheduler();
std::future<Result> start();
void stop();
void consumeSchedule(std::vector<ScheduleItem>&);
void consumeSchedule(const std::string& xmlStr);
void tick();
private:
std::atomic<bool> m_bContinue;
std::mutex m_mtx;
std::condition_variable m_FinishCondVar;
std::vector<ScheduleItem> m_vctSchedule;
Result loopThruTimes();
};
}