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