线程封装类(2)

来源:互联网 发布:如何判定论文数据造假 编辑:程序博客网 时间:2024/06/08 07:06
#ifndef __THREAD_H__  
#define __THREAD_H__ 


#ifndef  WIN32


#include <pthread.h>  
#define T_CALLBACK  
typedef pthread_t AIWHANDLE;  


#else
#include <windows.h>  
#define T_CALLBACK WINAPI  
typedef HANDLE AIWHANDLE;  


#endif


class CThreadX
{
public:
CThreadX(void);
virtual ~CThreadX(void);


virtual int Run();  
bool StartThread();  
bool Join();  
bool Detach();  


private:  
static void* T_CALLBACK RunThread(void* pParam);  
AIWHANDLE m_hThread;  
void* m_pParam;  
unsigned long m_nRet;  
protected:  
bool m_bStart;  
int m_nState;  
};




#endif


.cpp 

#include "Thread.h"




CThreadX::CThreadX()    
{    
m_hThread = NULL;    
m_pParam = NULL;    
m_nRet = 0;    
m_bStart = false;  
m_nState = 0;  
}    


CThreadX::~CThreadX()    
{  
if (m_bStart && (m_nState == 0))  
{  
Join();  
}  
}    


int CThreadX::Run()    
{    
return 0;    
}    


bool CThreadX::StartThread()    

if (true == m_bStart)  
return true;  


bool bOK = true;  
m_bStart = true;  


#ifdef WIN32  


if(NULL==(m_hThread=CreateThread(NULL,0, (unsigned long(T_CALLBACK*)(void*))&RunThread, this, 0, NULL)))
{  
bOK = false;  
}  
#else
if (0 != pthread_create(&m_hThread, NULL, RunThread, this))  
{  
bOK = false;  
}  
#endif  


if (!bOK)  
{  
m_bStart = false;  
return false;  
}  


return true;    
}    


bool CThreadX::Join()    
{    
if (!m_bStart)  
return false;  


if (m_nState == 1)  
return false;  


bool ret;  
m_bStart = false;  


#ifdef WIN32  
while (1)  
{  
if (FALSE == GetExitCodeThread(m_hThread, &m_nRet))    
{  
ret = false;  
break;  
}  
else    
{  
if (m_nRet == STILL_ACTIVE)  
{  
Sleep(100);  
continue;  
}  
CloseHandle(m_hThread);  
ret = true;  
break;  
}  
}  


#else
ret = (0 == pthread_join(m_hThread, (void **)&m_nRet));  
#endif  


m_hThread = NULL;  
return ret;  
}    


bool CThreadX::Detach()  
{  
if (!m_bStart)  
return false;  


if (m_nState == 1)  
return false;  


m_nState = 1;  
#ifdef WIN32 
return (TRUE == CloseHandle(m_hThread));  
#else
return (0 == pthread_detach(m_hThread));  
#endif  


}  


void* T_CALLBACK CThreadX::RunThread(void* pParam)    
{    
CThreadX* pThis = (CThreadX*)pParam;    
int nRet = pThis->Run();    
return (void *)nRet;  







//#include <stdio.h>  
//#include "Thread.h"  
//
//class CTest : public CThreadX 
//{  
//public:  
// int Run()  
// {  
// printf("1..\n");  
// return 0;  
// }  
//};  
//
//int main(int argc, char* argv[])  
//{  
// CTest a;  
// a.Start();  
//
// //a.Detach(); //分离线程  
//
// if (false == a.Join())  
// {  
// printf("join failed!\n");  
// }  
//
// return 0;  
//}  


2 0
原创粉丝点击