", ::GetTickCount()); } }; class Move : public Command { public: virtual void exec() override { printf("Do move..., tick count: %d\n", ::GetTickCount()); } }; class SleepCopy : public Command { public: SleepCopy(ActiveObjectEngine& e, DWORD dwDelay) : m_Engine(e), m_dwStartTime(0), m_dwDelay(dwDelay) {} SleepCopy(const SleepCopy& cmd) : m_Engine(cmd.m_Engine), m_dwStartTime(cmd.m_dwStartTime), m_dwDelay(cmd.m_dwDelay) { } virtual void exec() override { if (m_dwStartTime == 0) { m_dwStartTime = ::GetTickCount(); std::unique_ptr
newCmd(new SleepCopy(*this)); m_Engine.addCommand(std::move(newCmd)); } else { DWORD dwUsed = ::GetTickCount() - m_dwStartTime; if (dwUsed >= m_dwDelay) { printf("Do sleep copy..., delayed: %d ms\n", dwUsed); } else { std::unique_ptr
newCmd(new SleepCopy(*this)); m_Engine.addCommand(std::move(newCmd)); } } } private: DWORD m_dwStartTime; DWORD m_dwDelay; ActiveObjectEngine& m_Engine; }; int _tmain(int argc, _TCHAR* argv[]) { ActiveObjectEngine engine; std::unique_ptr
c1(new Copy()); std::unique_ptr
c2(new Move()); std::unique_ptr
c3(new SleepCopy(engine, 5000)); engine.addCommand(std::move(c1)); engine.addCommand(std::move(c2)); engine.addCommand(std::move(c3)); engine.run(); return 0; }
|