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 );
}