转:http://tech.ddvip.com/2009-09/1254284559134869.html
class CThread { public: CThread(void) { m_hThread = NULL; m_hEventExit = NULL; } virtual ~CThread(void) { if (m_hThread) { //删除的线程资源。 ::CloseHandle(m_hThread); } if (m_hEventExit) { //删除事件。 ::CloseHandle(m_hEventExit); } } //创建线程 HANDLE CreateThread(void) { //创建退出事件。 m_hEventExit = ::CreateEvent(NULL,TRUE,FALSE,NULL); if (!m_hEventExit) { //创建事件失败。 return NULL; } //创建线程。 m_hThread = ::CreateThread( NULL, //安全属性使用缺省。 0, //线程的堆栈大小。 ThreadProc, //线程运行函数地址。 this, //传给线程函数的参数。 0, //创建标志。 &m_dwThreadID); //成功创建后的线程标识码。 return m_hThread; } //等待线程结束。 void WaitFor(DWORD dwMilliseconds = INFINITE) { //发送退出线程信号。 ::SetEvent(m_hEventExit); //等待线程结束。 ::WaitForSingleObject(m_hThread,dwMilliseconds); } protected: // //线程运行函数。 //蔡军生 2007/09/21 // static DWORD WINAPI ThreadProc(LPVOID lpParameter) { //转换传送入来的参数。 CThread* pThread = reinterpret_cast<CThread *>(lpParameter); if (pThread) { //线程返回码。 //调用类的线程处理函数。 return pThread->Run(); } // return -1; } //线程运行函数。 //在这里可以使用类里的成员,也可以让派生类实现更强大的功能。 //蔡军生 2007/09/25 virtual DWORD Run(void) { //输出到调试窗口。 ::OutputDebugString(_T("Run()线程函数运行\r\n")); //线程循环。 for (;;) { DWORD dwRet = WaitForSingleObject(m_hEventExit,0); if (dwRet == WAIT_TIMEOUT) { //可以继续运行。 TCHAR chTemp[128]; wsprintf(chTemp,_T("ThreadID=%d\r\n"),m_dwThreadID); ::OutputDebugString(chTemp); //目前没有做什么事情,就让线程释放一下CPU。 Sleep(10); } else if (dwRet == WAIT_OBJECT_0) { //退出线程。 ::OutputDebugString(_T("Run() 退出线程\r\n")); break; } else if (dwRet == WAIT_ABANDONED) { //出错。 ::OutputDebugString(_T("Run() 线程出错\r\n")); return -1; } } return 0; } protected: HANDLE m_hThread; //线程句柄。 DWORD m_dwThreadID; //线程ID。 HANDLE m_hEventExit; //线程退出事件。 };