Active Object C++実装

3396 ワード

// 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<<"
*********
Excuted!
***********"<<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; }