www.pudn.com > cxThread.zip > cxThread.h


/* 
thread (WIN32)	 
 
Compile by£º BC++ 5; C++ BUILDER 4, 5, 6, X; VC++ 5, 6; VC.NET;  GCC; 
 
Update : 2004.11 
 
copyright(c) 2004.5 - 2004.11  llbird wushaojian@21cn.com 
*/ 
 
#ifndef _CX_THREAD_H_ 
#define _CX_THREAD_H_ 
 
#include  
#include  
#include  
 
 
 
//------------------------------class cxLocker----------------------------------- 
 
class cxLocker 
{ 
	CRITICAL_SECTION _csLock; 
public: 
	cxLocker() 						{		::InitializeCriticalSection(&_csLock);		} 
	~cxLocker()						{		::DeleteCriticalSection(&_csLock);			} 
	operator CRITICAL_SECTION*()	{		return  &_csLock;							} 
	void Lock()						{		::EnterCriticalSection(&_csLock);			} 
	void UnLock()					{		::LeaveCriticalSection(&_csLock);			} 
}; 
 
//------------------------------class cxLock----------------------------------- 
 
class cxLock 
{ 
	CRITICAL_SECTION* _pLock; 
public: 
	explicit cxLock(CRITICAL_SECTION * p) : _pLock(p)	{	::EnterCriticalSection(_pLock);		} 
	~cxLock()											{	::LeaveCriticalSection(_pLock);		} 
}; 
 
 
//------------------------------class cxEvent----------------------------------- 
 
class cxEvent 
{ 
	HANDLE _hEvent; 
	cxEvent(const cxEvent&); 
	cxEvent& operator = (const cxEvent& x); 
public: 
 
//------------------------------Construction----------------------------------- 
	 
	cxEvent(HANDLE Event) : _hEvent(Event) 
	{ 
	} 
 
	cxEvent(char *pName) : _hEvent(Create(NULL, FALSE, FALSE, pName))	 
	{ 
	}   
 
	cxEvent( 
		LPSECURITY_ATTRIBUTES  lpEventAttributes = NULL,  
		BOOL bManualReset = FALSE, 
		BOOL bInitialState = FALSE,  
		char *pName = NULL 
		) : _hEvent(Create(lpEventAttributes, bManualReset, bInitialState, pName)) 
	{ 
	} 
 
	~cxEvent()				 
	{ 
		if(_hEvent)	 
			::CloseHandle(_hEvent);												 
	} 
	 
//----------------------------------Attributes---------------------------------- 
 
	operator HANDLE()	{		return _hEvent;					} 
	bool IsValid()		{		return _hEvent != NULL;			} 
 
//----------------------------------Operations---------------------------------- 
	 
	HANDLE Create( 
		LPSECURITY_ATTRIBUTES  lpEventAttributes = NULL,  
		BOOL bManualReset = FALSE, 
		BOOL bInitialState = FALSE,  
		char *pName = NULL 
		) 
	{ 
		HANDLE hTemp = ::CreateEvent(lpEventAttributes, bManualReset, bInitialState, pName); 
		THROW_ERROR(hTemp == NULL); 
		return hTemp; 
	} 
 
	bool Wait(DWORD dwWaitTime = INFINITE)	 
	{ 
		return ::WaitForSingleObject(_hEvent, dwWaitTime) == WAIT_OBJECT_0; 
	} 
 
	void Lock() 
	{ 
		::WaitForSingleObject(_hEvent, INFINITE); 
	} 
 
    BOOL Reset()		{		return ::ResetEvent(_hEvent);	} 
    BOOL Set()			{		return ::SetEvent(_hEvent);		} 
    BOOL Pulse() 		{		return ::PulseEvent(_hEvent);	} 
}; 
 
//------------------------------class cxThread----------------------------------- 
 
class cxThread  
{ 
private: 
 
	static DWORD WINAPI DefaultThreadProc(LPVOID lpPara) 
	{ 
		return ( (cxThread *)lpPara ) -> ThreadProc(); 
	} 
	cxThread(const cxThread&); 
	cxThread& operator = (const cxThread& x); 
	cxLocker _ThreadLocker; 
 
protected: 
 
	virtual DWORD ThreadProc()		{		return 0;												}  
	HANDLE _hThreadHandle; 
	DWORD _dwThreadID; 
 
public: 
 
//------------------------------Construction----------------------------------- 
 
	cxThread()						{		_hThreadHandle = NULL, _dwThreadID = 0;					} 
	virtual ~cxThread()				{		Terminate();											} 
 
//----------------------------------Attributes---------------------------------- 
 
	operator HANDLE() 				{	 	return _hThreadHandle;									} 
	const HANDLE GetThreadHandle()	{		return _hThreadHandle;									} 
	const DWORD GetThreadID()	 	{		return _dwThreadID;										} 
	bool IsRunning()				{		return _hThreadHandle != NULL;						 	} 
	BOOL GetPriority()				{		return GetThreadPriority(_hThreadHandle) ;				} 
	BOOL SetPriority(int iPriority)	{		return SetThreadPriority(_hThreadHandle, iPriority);	} 
 
//----------------------------------Operations---------------------------------- 
 
	inline void Lock()				{		_ThreadLocker.Lock();									} 
	inline void UnLock()			{		_ThreadLocker.UnLock();									} 
 
	inline bool virtual Begin(DWORD dwCreationFlags = 0)  // Begin equal run 
	{		 
		return Run(dwCreationFlags);	 
	} 
 
	inline bool virtual Begin(LPTHREAD_START_ROUTINE threadProc, LPVOID lpPara = NULL, DWORD dwCreationFlags = 0) 
	{ 
		return Run(threadProc, lpPara, dwCreationFlags); 
	} 
		 
	bool virtual Run(DWORD dwCreationFlags = 0) 
	{ 
		if(IsRunning()) 
			Stop(); 
 
		_hThreadHandle = CreateThread(NULL, 0, cxThread::DefaultThreadProc, this, dwCreationFlags, &_dwThreadID); 
 
		THROW_ERROR(_hThreadHandle == NULL); 
 
		return  IsRunning(); 
	}; 
 
	bool virtual Run(LPTHREAD_START_ROUTINE threadProc, LPVOID lpPara = NULL, DWORD dwCreationFlags = 0) 
	{ 
		assert(threadProc != NULL); 
 
		if(IsRunning()) 
			Stop(); 
 
		_hThreadHandle = CreateThread(NULL, 0, threadProc, lpPara, dwCreationFlags, &_dwThreadID); 
 
		THROW_ERROR(_hThreadHandle == NULL); 
 
		return  IsRunning(); 
	}; 
 
#ifdef  _MT 
 
	inline bool virtual Begin(void( __cdecl *threadProc )( void * ), LPVOID lpPara = NULL) 
	{ 
		return Run(threadProc, lpPara); 
	} 
 
	inline bool virtual Begin(unsigned ( __stdcall *threadProc )( void * ), LPVOID lpPara = NULL, DWORD dwCreationFlags = 0) 
	{ 
		return Run(threadProc, lpPara, dwCreationFlags); 
	}  
 
	bool virtual Run(void( __cdecl *threadProc )( void * ), LPVOID lpPara = NULL) 
	{ 
		assert(threadProc != NULL); 
 
		if(IsRunning()) 
			Stop(); 
 
		_hThreadHandle = (HANDLE)_beginthread(threadProc, 0, lpPara); 
 
		if(_hThreadHandle == (HANDLE) -1L) 
			_hThreadHandle = NULL; 
 
		THROW_ERROR(_hThreadHandle == NULL); 
 
		return  IsRunning(); 
	}; 
 
	bool virtual Run(unsigned ( __stdcall *threadProc )( void * ), LPVOID lpPara = NULL, DWORD dwCreationFlags = 0) 
	{ 
		assert(threadProc != NULL); 
 
		if(IsRunning()) 
			Stop(); 
 
		_hThreadHandle = (HANDLE)_beginthreadex(NULL, 0, threadProc, lpPara, dwCreationFlags, (unsigned int *)&_dwThreadID); 
 
		THROW_ERROR(_hThreadHandle == NULL); 
 
		return  IsRunning(); 
	}; 
	 
#endif	 // _MT 
 
	inline void virtual End(DWORD dwEndCode = 0) 
	{ 
		Terminate(dwEndCode); 
	} 
 
	void virtual Terminate(DWORD dwEndCode = 0) 
	{ 
		if(IsRunning()) 
		{ 
			TerminateThread(_hThreadHandle, dwEndCode); 
			CloseHandle(_hThreadHandle); 
			_hThreadHandle = NULL; 
		} 
	} 
 
	void virtual Stop(DWORD dwEndCode = 0) 
	{ 
		Terminate(dwEndCode); 
	} 
 
	bool WaitFor(DWORD dwWaitTime = INFINITE)	//Wait the Thread Auto Terminate in (dwWaitTime) 
	{ 
		return WaitForSingleObject(_hThreadHandle, dwWaitTime) == WAIT_OBJECT_0; 
	} 
 
	virtual bool Suspend() 
	{ 
		return SuspendThread(_hThreadHandle) != (DWORD)(-1L); 
	} 
 
	virtual bool Resume() 
	{ 
		return ResumeThread(_hThreadHandle) != (DWORD)(-1L); 
	} 
	 
} ; 
 
#endif //_CX_THREAD_H_