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: }