#include "stdafx.h" #include #include "Thread.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif unsigned int WINAPI ThreadProc(IN LPVOID lpParam); CThreadBase::CThreadBase() { m_nIndex = -1; m_hThread = NULL; m_ThreadStatus = THREADSTATUS_STOP; m_hWakeUpSignal = NULL; m_hExitEvent = NULL; m_nThreadID = 0; for(int i=0; i<2; i++) m_hEvent[i] = NULL; } CThreadBase::~CThreadBase() { } /************************************************************************/ /* 函数:Start 描述:启动线程 参数: 返回:1成功, 0失败 */ /************************************************************************/ int CThreadBase::Start() { if(m_ThreadStatus != THREADSTATUS_STOP) return 1; if(m_hEvent[0] == NULL) { for(int i=0; i<2; i++) m_hEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL); } /* if(m_hExitEvent == NULL) m_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if(m_hWakeUpSignal == NULL) { m_hWakeUpSignal = CreateSemaphore(NULL, 1, 2, NULL); WaitForSingleObject(m_hWakeUpSignal, INFINITE); } */ if(m_hThread == NULL) m_hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, this, 0, &m_nThreadID); if(m_hThread == 0) { OutputDebugString(_T("创建线程失败\n")); return 0; } m_ThreadStatus = THREADSTATUS_WAIT; return 1; } /************************************************************************/ /* 函数:Stop 描述:停止 参数: 返回:1成功,0失败 */ /************************************************************************/ int CThreadBase::Stop() { if(m_hEvent[1]) SetEvent(m_hEvent[1]); // if(m_hExitEvent) // SetEvent(m_hExitEvent); //if(m_hWakeUpSignal) // CloseHandle(m_hWakeUpSignal); //m_hWakeUpSignal = NULL; // if(m_hExitEvent) // CloseHandle(m_hExitEvent); // m_hExitEvent = NULL; return 1; } void CThreadBase::Exit() { if(m_hEvent[1]) SetEvent(m_hEvent[1]); // if(m_hExitEvent) // SetEvent(m_hExitEvent); if(m_hThread) { #ifdef _DEBUG CString strMsg = _T(""); strMsg.Format(_T("线程%d 等待退出\n"), m_nThreadID); OutputDebugString(strMsg); WaitForSingleObject(m_hThread, INFINITE); strMsg.Format(_T("线程%d 退出\n"), m_nThreadID); OutputDebugString(strMsg); #else WaitForSingleObject(m_hThread, INFINITE); #endif //#ifdef _DEBUG CloseHandle(m_hThread); } m_hThread = NULL; //if(m_hWakeUpSignal) // CloseHandle(m_hWakeUpSignal); //m_hWakeUpSignal = NULL; // if(m_hExitEvent) // CloseHandle(m_hExitEvent); // m_hExitEvent = NULL; for(int i=0; i<2; ++i) { CloseHandle(m_hEvent[i]); m_hEvent[i] = NULL; } } /************************************************************************/ /* 函数:WakeUp 描述:唤醒 参数: 返回:1成功,0失败 */ /************************************************************************/ void CThreadBase::WakeUp() { //重置信号 // if(m_hWakeUpSignal) // ReleaseSemaphore(m_hWakeUpSignal, 1, NULL); #ifdef _DEBUG CString strMsg = _T(""); strMsg.Format(_T("ID = %d 唤醒\n"), m_nThreadID); OutputDebugString(strMsg); #endif //#ifdef _DEBUG if(m_hEvent[0]) SetEvent(m_hEvent[0]); } /************************************************************************/ /* 函数:WorkItem 描述:工作项 参数: IN LPVOID lpParam 返回:0 */ /************************************************************************/ unsigned int WINAPI ThreadProc(IN LPVOID lpParam) { CThreadBase* p = (CThreadBase*)lpParam; while(1) { int nSatus = p->Run(); if(nSatus == THREADSTATUS_EXIT) // 线程退出 { p->Close(); delete p; p = NULL; break; } if(nSatus == THREADSTATUS_END) // 程序结束 break; } return 0; } /************************************************************************/ /* 函数:Close 描述:关闭 参数: IN LPVOID lpParam 返回:0 */ /************************************************************************/ void CThreadBase::Close() { if(m_hThread) CloseHandle(m_hThread); m_hThread = NULL; for(int i=0; i<2; ++i) { CloseHandle(m_hEvent[i]); m_hEvent[i] = NULL; } CString strMsg = _T(""); strMsg.Format(_T("id = %d 已关闭\n"), m_nThreadID); OutputDebugString(strMsg); }