zoukankan      html  css  js  c++  java
  • Active Object C++智能指针实现

    #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;
    }
  • 相关阅读:
    如何诊断RAC数据库上的“IPC Send timeout”问题?
    ORA-1157处理过程
    ORA-1157 Troubleshooting
    SQL优化案例(执行计划固定)
    数据库io层面故障
    sql优化案例(索引创建不合理)
    SQL优化案例(union问题)
    Redis在Windows下的安装与使用
    npm使用淘宝镜像
    基于compose单机部署 etcd + coredns
  • 原文地址:https://www.cnblogs.com/lilun/p/1912635.html
Copyright © 2011-2022 走看看