タイマー機能を実現する Poco::Timer を紹介します。
また、スレッドセーフなカウンタ Poco::AtomicCounter も併せて紹介します。
Poco::Timer はスレッドベースなタイマで、1インスタンス当たり1つスレッドが起きます。
最初のコールバック発生までの startInterval と、それ以降の周期的なコールバック間隔 periodicInterval の2者を、インスタンス生成時にミリ秒で指定します。
コールバック関数 onTimer() は、Poco::Timer のインスタンスを timer とすれば、MyClass の中からだったら:
Poco::TimerCallback<MyClass> callback(*this, &MyClass::onTimer); timer.start(callback); |
のように start 時に指定します。
Poco::AtomicCounter はスレッドセーフなカウンタで、Windows と Mac OS X とではアトミック命令が実行され、それ以外のアトミック命令が無いプラットフォームでは Poco::FastMutex でガードされます。
TimerTest.cpp
・最初のコールバック発生までを 250msec、それ以降の周期を 500msec に指定。
・コールバック関数は: TimerCallbackWithLogMessage::onTimer()
・Poco::AtomicCounter は、main() と TimerCallbackWithLogMessage::onTimer() の両者で参照。
#include <Poco/Timer.h> #include <Poco/Stopwatch.h> #include <Poco/Thread.h> #include <Poco/Format.h> #include <Poco/AtomicCounter.h> #include <string> #include "ScopedLogMessage.h" #include "PrepareConsoleLogger.h" class TimerCallbackWithLogMessage { public: TimerCallbackWithLogMessage(ScopedLogMessage& msg, Poco::AtomicCounter& counter) : m_msg(msg) , m_counter(counter) { m_stopwatch.start(); } void onTimer(Poco::Timer& timer) { m_msg.Message(Poco::format(" TimerCallback %4Ldmsec [counter=%d]" , m_stopwatch.elapsed()/1000 , m_counter.value())); ++m_counter; } private: Poco::Stopwatch m_stopwatch; ScopedLogMessage& m_msg; Poco::AtomicCounter& m_counter; }; int main(int /*argc*/, char** /*argv*/) { PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION); ScopedLogMessage msg("TimerTest ", "start", "end"); Poco::AtomicCounter counter; TimerCallbackWithLogMessage callback(msg, counter); Poco::Timer timer(250, 500); timer.start(Poco::TimerCallback<TimerCallbackWithLogMessage>(callback, &TimerCallbackWithLogMessage::onTimer)); while(counter.value() < 9) { msg.Message(Poco::format(" while loop in main() [counter=%d]", counter.value())); Poco::Thread::sleep(1000); } timer.stop(); return 0; } |
Results of execution
・TimerCallback 側は thread ID が 1
[0] TimerTest start [0] while loop in main() [counter=0] [1] TimerCallback 249msec [counter=0] [1] TimerCallback 749msec [counter=1] [0] while loop in main() [counter=2] [1] TimerCallback 1249msec [counter=2] [1] TimerCallback 1750msec [counter=3] [0] while loop in main() [counter=4] [1] TimerCallback 2250msec [counter=4] [1] TimerCallback 2750msec [counter=5] [0] while loop in main() [counter=6] [1] TimerCallback 3249msec [counter=6] [1] TimerCallback 3749msec [counter=7] [0] while loop in main() [counter=8] [1] TimerCallback 4249msec [counter=8] [1] TimerCallback 4750msec [counter=9] [0] TimerTest end |
Downloads
・ここをクリックすると、makefile や VC++ プロジェクトなど一式がダウンロードできます。
(2013.05.31 updated)
・2010年5月27日からのダウンロード数:1146
Subversion
・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。
![]() |
Copyright © 2010 Round Square Inc. All rights reserved. |
---|
0 Comments.