Poco::Timer

タイマー機能を実現する 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日からのダウンロード数:832

Subversion

・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。

Powered by POCO Copyright © 2010 Round Square Inc. All rights reserved.


Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>