File Annotation

Not logged in
dcdd144598 2011-02-23        kinaba: #include "stdafx.h"
dcdd144598 2011-02-23        kinaba: #include "thread.h"
dcdd144598 2011-02-23        kinaba: using namespace ki;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: ThreadManager* ThreadManager::pUniqueInstance_;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: ThreadManager::ThreadManager()
dcdd144598 2011-02-23        kinaba: 	: threadNum_(0)
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 唯一のインスタンスは私です。
dcdd144598 2011-02-23        kinaba: 	pUniqueInstance_ = this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: DWORD WINAPI ThreadManager::ThreadStubFunc(void* param)
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Runnable* r = static_cast<Runnable*>(param);
dcdd144598 2011-02-23        kinaba: 	r->StartThread();
dcdd144598 2011-02-23        kinaba: 	r->FinalizeThread();
dcdd144598 2011-02-23        kinaba: 	return 0;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void ThreadManager::Run( Runnable& r )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	r.PleaseExit();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	DWORD id;
dcdd144598 2011-02-23        kinaba: 	r.hThread_ = ::CreateThread(
dcdd144598 2011-02-23        kinaba: 		NULL, 0, &ThreadStubFunc, &r, CREATE_SUSPENDED, &id );
dcdd144598 2011-02-23        kinaba: 	r.hEvent_  = ::CreateEvent( NULL, TRUE, FALSE, NULL );
dcdd144598 2011-02-23        kinaba: 	::ResumeThread( r.hThread_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Runnable::Runnable()
dcdd144598 2011-02-23        kinaba: 	: hThread_( NULL )
dcdd144598 2011-02-23        kinaba: 	, hEvent_ ( NULL )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Runnable::~Runnable()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	PleaseExit(); // あくまで最終手段
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool Runnable::isRunning() const
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	return hThread_ != NULL;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool Runnable::isExitRequested() const
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	return WAIT_OBJECT_0 == ::WaitForSingleObject( hEvent_, 0 );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Runnable::FinalizeThread()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	::CloseHandle( hThread_ );
dcdd144598 2011-02-23        kinaba: 	hThread_ = NULL;
dcdd144598 2011-02-23        kinaba: 	::CloseHandle( hEvent_ );
dcdd144598 2011-02-23        kinaba: 	hEvent_  = NULL;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Runnable::PleaseExit()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( HANDLE ht = hThread_ )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		::SetEvent( hEvent_ );
dcdd144598 2011-02-23        kinaba: 		::WaitForSingleObject( ht, INFINITE );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }