Poco::ThreadTarget

Poco::ThreadTargetPoco::RunnableAdapter を紹介します。

クラスのスタティックメンバ関数や(クラスに属さない)単独の関数は、Poco::ThreadTarget を使うと、別スレッドで実行することができます。
クラスの非スタティックメンバ関数を別スレッドで実行する場合は、Poco::RunnableAdapter を使います。

ThreadTargetTest.cpp

・TestThreadTarget::StaticMethod と TestFunction を、Poco::ThreadTarget を使って別スレッドで実行。
・TestThreadTarget::MemberMethod を、Poco::RunnableAdapter を使って別スレッドで実行。
・実行結果が美しくなるよう、上記3つの関数内で適当な時間スリープさせる。

#include <Poco/Runnable.h>
#include <Poco/Random.h>
#include <Poco/Thread.h>
#include <Poco/Format.h>
#include <Poco/ThreadPool.h>
#include <Poco/ThreadTarget.h>
#include <Poco/RunnableAdapter.h>
 
#include <string>
 
#include "ScopedLogMessage.h"
#include "PrepareConsoleLogger.h"
 
const long kSleepStartInterval	= 30;
const long kSleepMemberMethod	= 300;
const long kSleepStaticMethod	= 500;
const long kSleepFunction	= 400;
 
ScopedLogMessage* g_pMsg = NULL;
 
class TestThreadTarget
{
public:
	TestThreadTarget(ScopedLogMessage& msg) :
		m_Msg(msg)
	{
	}
 
	void MemberMethod(void)
	{
		m_Msg.Message("  MemberMethod() start");
		Poco::Thread::sleep(kSleepMemberMethod);
		m_Msg.Message("  MemberMethod() end");
	}
 
	static void StaticMethod(void);
 
private:
	ScopedLogMessage&	m_Msg;
};
 
void TestThreadTarget::StaticMethod(void)
{
	if(NULL != g_pMsg)
	{
		g_pMsg->Message("  StaticMethod() start");
		Poco::Thread::sleep(kSleepStaticMethod);
		g_pMsg->Message("  StaticMethod() end");
	}
}
 
void TestFunction(void)
{
	if(NULL != g_pMsg)
	{
		g_pMsg->Message("  TestFunction() start");
		Poco::Thread::sleep(kSleepFunction);
		g_pMsg->Message("  TestFunction() end");
	}
}
 
int main(int /*argc*/, char** /*argv*/)
{
	PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION);
 
	ScopedLogMessage msg("ThreadTargetTest ", "start", "end");
	g_pMsg = &msg;
 
	TestThreadTarget target(msg);
 
	Poco::ThreadTarget raStatic(&TestThreadTarget::StaticMethod);
	Poco::ThreadTarget raFunction(TestFunction);
	Poco::RunnableAdapter<TestThreadTarget> raMember(target, &TestThreadTarget::MemberMethod);
 
	Poco::ThreadPool::defaultPool().start(raStatic);
	Poco::Thread::sleep(kSleepStartInterval);
	Poco::ThreadPool::defaultPool().start(raFunction);
	Poco::Thread::sleep(kSleepStartInterval);
	Poco::ThreadPool::defaultPool().start(raMember);
 
	Poco::ThreadPool::defaultPool().joinAll();
 
	return 0;
}

Results of execution

[0] ThreadTargetTest start
[1]   StaticMethod() start
[2]   TestFunction() start
[3]   MemberMethod() start
[3]   MemberMethod() end
[2]   TestFunction() end
[1]   StaticMethod() end
[0] ThreadTargetTest end

Downloads

ここをクリックすると、makefile や VC++ プロジェクトなど一式がダウンロードできます。
(2013.05.31 updated)
・2010年7月19日からのダウンロード数:777

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>