123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #include "stdafx.h"
- #include <process.h>
- #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);
- }
|