Active Object C++實現

來源:互聯網
上載者:User
// ActiveObject.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <Windows.h>#include <deque>#include <iostream>using namespace std;double secondsPerTick = 0;class Command{public:virtual void Execute()=0;};class ActiveObjectEngine{deque<Command*> itsCommands;public:void AddCommand(Command* c){itsCommands.push_back(c);}void Run(){while (itsCommands.size()>0){Command* c = itsCommands.front();c->Execute();itsCommands.pop_front();}}};class SleepCommmand : public Command{Command* wakeupCommand;ActiveObjectEngine * engine;double sleepTime;bool started;LARGE_INTEGER lv;double start_time;public:SleepCommmand(double milliseconds, ActiveObjectEngine* e, Command* 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;engine->AddCommand(this);}else{double elasped_time = current_time - start_time;if (elasped_time < sleepTime){engine->AddCommand(this);Sleep(1);}else{engine->AddCommand(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 ActiveObjectEngine* engine;DelayedTyper(double delay, char c){itsDelay = delay;itsChar = c;}virtual void Execute(){cout<<itsChar;if (!stop){DelayAndRepeat();}}void DelayAndRepeat(){engine->AddCommand(new SleepCommmand(itsDelay,engine,this));}};bool DelayedTyper::stop = false;ActiveObjectEngine* 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// WakeupCommand* wakup = new WakeupCommand();// ActiveObjectEngine* e =  new ActiveObjectEngine();// SleepCommmand* c = new SleepCommmand(6,e,wakup);// e->AddCommand(c);// cout<<"Start...:"<<current_time;// e->Run();// Periodic DelayedTyper::engine->AddCommand(new DelayedTyper(0.1,'1'));DelayedTyper::engine->AddCommand(new DelayedTyper(1,'2'));DelayedTyper::engine->AddCommand(new DelayedTyper(3,'3'));Command* stop_command = new StopCommand;DelayedTyper::engine->AddCommand(new SleepCommmand(10,DelayedTyper::engine,stop_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.