Active Object C++智能指標實現

來源:互聯網
上載者:User
#include <Windows.h>#include <deque>#include <iostream>#include <boost/shared_ptr.hpp>#include <boost/weak_ptr.hpp>#include <boost/enable_shared_from_this.hpp>using namespace std;using namespace boost;class Command;class ActiveObjectEngine;typedef shared_ptr<Command> CommandPtr;typedef shared_ptr<ActiveObjectEngine> ActiveObjectEnginePtr;typedef weak_ptr<ActiveObjectEngine> ActiveObjectEngineWeakPtr;double secondsPerTick = 0;class Command : public enable_shared_from_this<Command>  {public:virtual void Execute()=0;};class ActiveObjectEngine{deque<CommandPtr> itsCommands;public:void AddCommand(CommandPtr c){itsCommands.push_back(c);}void Run(){while (itsCommands.size()>0){CommandPtr c = itsCommands.front();c->Execute();itsCommands.pop_front();}}};class SleepCommmand : public Command{CommandPtr wakeupCommand;ActiveObjectEngineWeakPtr engine;double sleepTime;bool started;LARGE_INTEGER lv;double start_time;public:SleepCommmand(double milliseconds, ActiveObjectEngineWeakPtr e, CommandPtr wc): started(false){sleepTime = milliseconds;engine = e;wakeupCommand = wc;}virtual void Execute(){QueryPerformanceCounter( &lv );double current_time = secondsPerTick * lv.QuadPart;if (!started){started = true;start_time = current_time;ActiveObjectEnginePtr strong_ptr = engine.lock();if (strong_ptr)strong_ptr->AddCommand(shared_from_this());}else{double elasped_time = current_time - start_time;if (elasped_time < sleepTime){ActiveObjectEnginePtr strong_ptr = engine.lock();if (strong_ptr)strong_ptr->AddCommand(shared_from_this());Sleep(1);}else{ActiveObjectEnginePtr strong_ptr = engine.lock();if (strong_ptr)strong_ptr->AddCommand(CommandPtr(wakeupCommand));}}}};class WakeupCommand : public Command{bool excuted;public:WakeupCommand(){excuted = false;}virtual void Execute(){LARGE_INTEGER lv;QueryPerformanceCounter( &lv );double current_time = secondsPerTick * lv.QuadPart;excuted = true;//cout<<"\n*********\nExcuted!\n***********"<<current_time;}};class DelayedTyper : public Command{public:double itsDelay;char itsChar;static bool stop;static ActiveObjectEnginePtr engine;DelayedTyper(double delay, char c){itsDelay = delay;itsChar = c;}virtual void Execute(){cout<<itsChar;if (!stop){DelayAndRepeat();}}void DelayAndRepeat(){CommandPtr c(new SleepCommmand(itsDelay,engine,shared_from_this()));engine->AddCommand(c);}};bool DelayedTyper::stop = false;ActiveObjectEnginePtr DelayedTyper::engine(new ActiveObjectEngine);class StopCommand : public Command{public:virtual void Execute(){DelayedTyper::stop = true;}};int _tmain(int argc, _TCHAR* argv[]){LARGE_INTEGER lv;QueryPerformanceFrequency( &lv );secondsPerTick = 1.0 / lv.QuadPart;QueryPerformanceCounter( &lv );double current_time = secondsPerTick * lv.QuadPart;///One shot/* shared_ptr<WakeupCommand> wakup(new WakeupCommand()); ActiveObjectEnginePtr e (new ActiveObjectEngine()); shared_ptr<SleepCommmand> c(new SleepCommmand(6,e,wakup)); e->AddCommand(c); cout<<"Start...:"<<current_time; e->Run();*/// Periodic DelayedTyper::engine->AddCommand(CommandPtr(new DelayedTyper(0.01,'1')));DelayedTyper::engine->AddCommand(CommandPtr(new DelayedTyper(1,'2')));DelayedTyper::engine->AddCommand(CommandPtr(new DelayedTyper(3,'3')));CommandPtr sleep_command(new SleepCommmand(6,DelayedTyper::engine,CommandPtr(new StopCommand))); DelayedTyper::engine->AddCommand(sleep_command);DelayedTyper::engine->Run();return 0;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.