www.gusucode.com > 让程序自动管理线程的代码C++源码程序 > 让程序自动管理线程的代码/TestManagerThread/testmanagerthread/ThreadTask.cpp
// ThreadTask.cpp: implementation of the ThreadTask class. // ////////////////////////////////////////////////////////////////////// //************************************************************* //作者:赵明 //EMAIL:zmpapaya@hotmail.com;papaya_zm@sina.com //主页:http://h2osky.126.com /********************************************************/ #include "stdafx.h" //#include "managerthread.h" #include "ThreadTask.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif class CHandle : public CObject { DECLARE_DYNAMIC( CHandle ) public: HANDLE m_ThreadHandle; }; IMPLEMENT_DYNAMIC( CHandle, CObject ) ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// DWORD WINAPI ThreadTaskpro(LPVOID pParam); ThreadTask::ThreadTask() { m_bKeepGoing = TRUE; DWORD nThreadId = 0; m_Handle = (HANDLE)::CreateThread(NULL,0,ThreadTaskpro,0,0,&nThreadId ); } void ThreadTask::AddHandle( CONST HANDLE cHandle ) { CHandle *pHandle = new CHandle; pHandle->m_ThreadHandle = cHandle; m_ObList.AddTail( pHandle ); } void ThreadTask::CloseThreadHandles() { if ( m_ObList.GetCount() ) { POSITION pos1, pos2; CHandle *pHandle = (CHandle *)NULL; DWORD dwExitCode = 0L; for( pos1=m_ObList.GetHeadPosition(); (pos2=pos1)!=POSITION(NULL); ) { pHandle = DYNAMIC_DOWNCAST( CHandle, m_ObList.GetNext( pos1 ) ); VERIFY( ::GetExitCodeThread( pHandle->m_ThreadHandle, &dwExitCode ) ); if ( dwExitCode != STILL_ACTIVE ) { m_ObList.RemoveAt( pos2 ); VERIFY( ::CloseHandle( pHandle->m_ThreadHandle ) ); delete pHandle; pHandle = (CHandle *)NULL; AfxMessageBox("一个线程被关闭"); } } } } ThreadTask::~ThreadTask() { } ThreadTask & ThreadTask::GetThreadTask() { static ThreadTask Taker; return (Taker) ; } BOOL ThreadTask::IsValid() { BOOL bValid_Status = FALSE; if ( (this != NULL) && AfxIsValidAddress( this, sizeof( ThreadTask ) ) ) bValid_Status = TRUE; return( bValid_Status ); }