ThreadManager(ThreadPrc threadpro,LPVOID pParam);
RunThread();
HANDLE GetThreadHandle();
HANDLE m_Handle;
typedef DWORD (WINAPI *ThreadPro)(LPVOID); class CThreadManager : public CObject { DECLARE_DYNAMIC( CThreadManager ) public: CThreadManager( ThreadPrc threadpro, LPVOID pParam); ~CThreadManager(); CBOOL RunThread(); HANDLE GetThreadHandle() const { return( m_Handle ); }; private: HANDLE m_Handle; };
class CThreadTask : public CObject { DECLARE_DYNAMIC( CThreadTask ) public: CThreadTask(); //构造函数 ~CThreadTask(); CBOOL IsValid(); void AddHandle( CONST HANDLE cHandle ); //添加线程句柄到m_ObList中 void CloseThreadHandles(); //(关闭线程) static CThreadTask& GetCThreadTask(); //用于在Managerthread类中获得ThreadTask类的指针 CObList m_ObList;//线程句柄组 HANDLE m_Handle;//线程句柄 BOOL m_bKeepGoing;//是否已运行 }; IMPLEMENT_DYNAMIC( CThreadCareTaker, CObject )
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; //(CHandle类相当简单,只有一个成员函数m_ThreadHandle) DWORD dwExitCode = 0L; for( pos1=m_ObList.GetHeadPosition(); (pos2=pos1)!=POSITION(NULL); ) { //历遍所有已有的线程句柄 pHandle = DYNAMIC_DOWNCAST( CHandle, m_ObList.GetNext( pos1 ) ); //获得第pos1个handle VERIFY( ::GetExitCodeThread( pHandle->m_ThreadHandle, &dwExitCode ) ); //获得线程pHandle的当前状态 if ( dwExitCode != STILL_ACTIVE ) //如果已完成 { //释放当前句柄 m_ObList.RemoveAt( pos2 ); VERIFY( ::CloseHandle( pHandle->m_ThreadHandle ) ); delete pHandle; pHandle = (CHandle *)NULL; } } } } ThreadTask::~ThreadTask() { } ThreadTask & ThreadTask::GetThreadTask() { //返回静态ThreadTask对象,以便ThreadManager类调用 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 ); }
DWORD WINAPI ThreadTaskpro( LPVOID pParam ) { HANDLE hCurrentThread = GetCurrentThread(); //获得该线程句柄 SetThreadPriority( hCurrentThread, THREAD_PRIORITY_LOWEST ); //设为最低 while ( ThreadTask::GetThreadTask().m_bKeepGoing ) { Sleep(500); //休息500mms ThreadTask::GetThreadTask().CloseThreadHandles(); } SetThreadPriority( hCurrentThread, THREAD_PRIORITY_NORMAL ); return( 0 ); }
ThreadManager::ThreadManager(ThreadPro threadpro, LPVOID pParam) { DWORD nThreadId = 0; _ASSERTE( ThreadTask::GetThreadTask().IsValid() ); //运行ThreadTask类 m_Handle = (HANDLE)::CreateThread(NULL,0,threadpro,(LPVOID)pParam,0,&nThreadId ); //创建要管理的线程,并返回句柄 if ( ThreadTask::GetThreadTask().m_bKeepGoing ) { //如果ThreadTask运行了的话 ASSERT( m_Handle ); ThreadTask::GetThreadTask().AddHandle( m_Handle ); //把句柄加入ThreadTask类中,以便管理 } } ThreadManager::~ThreadManager() { } BOOL ThreadManager::RunThread() { //运行线程 return( ::ResumeThread( m_Handle ) != 0xFFFFFFFF ); }
ThreadManager ThreadManager( &MyThread1, (LPVOID)m_pro ); ThreadManager.RunThread();