📄 athread.cpp
字号:
#include "StdAfx.h"
#include "AThread.h"
namespace techwin
{
AThread::AThread()
: m_hThread(NULL)
, m_dwThreadID(0)
, m_hStopEvent(NULL)
, m_bDeleteMeAfterCompletion(FALSE)
, m_bWaitForThreadToExitWhenStop(TRUE)
{
}
AThread::~AThread()
{
Stop();
}
BOOL AThread::IsActive() const
{
DWORD dwExitCode = 0;
::GetExitCodeThread(m_hThread, &dwExitCode);
return (dwExitCode == STILL_ACTIVE);
}
/*
BOOL AThread::IsStopRequest() const
{
return m_bStopRequest;
}
*/
BOOL AThread::Create()
{
// 悼累 犬牢
if( IsActive() ) return FALSE;
// 捞亥飘 积己
m_hStopEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
if( m_hStopEvent == NULL)
{
return FALSE;
}
// 胶饭靛 积己
m_hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, 0/*CREATE_SUSPENDED*/, &m_dwThreadID);
if( m_hThread == NULL )
{
::CloseHandle(m_hStopEvent);
return FALSE;
}
// m_bStopRequest = FALSE;
return TRUE;
}
BOOL AThread::Stop()
{
// DWORD dwRetCode;
// 胶饭靛啊 酒流 倒绊 乐栏搁, 肯傈洒 沥瘤且 锭鳖瘤 扁促覆
if( m_bWaitForThreadToExitWhenStop && IsActive() )
{
VERIFY( ::SetEvent(m_hStopEvent) );
::WaitForSingleObject(m_hThread, INFINITE);
}
// 磊盔阑 叭绰促
ResetEvent(m_hStopEvent);
::CloseHandle(m_hThread);
::CloseHandle(m_hStopEvent);
m_hThread = 0;
m_dwThreadID = 0;
m_hStopEvent = NULL;
/*
// 胶饭靛啊 酒流 倒绊 乐栏搁, 肯傈洒 沥瘤且 锭鳖瘤 扁促覆
if( m_bWaitForThreadToExitWhenStop && IsActive() )
{
BOOL res = ::SetEvent(m_hStopEvent);
assert(res);
// ::WaitForSingleObject(m_hThread, 1000);
stop:
dwRetCode = ::WaitForSingleObject(m_hThread, 1000);
switch(dwRetCode)
{
case WAIT_OBJECT_0:
AfxMessageBox(TEXT("辆丰 己傍"));
// the process has exited
// 静饭靛啊 辆丰等 饶 秦具 且 累诀甸
// 磊盔阑 叭绰促
ResetEvent(m_hStopEvent);
::CloseHandle(m_hThread);
::CloseHandle(m_hStopEvent);
m_hThread = 0;
m_dwThreadID = 0;
m_hStopEvent = NULL;
// m_bStopRequest = FALSE;
return TRUE;
case WAIT_TIMEOUT:
AfxMessageBox(TEXT("鸥烙酒眶"));
// the process is still executing
GetExitCodeThread(m_hThread, &dwRetCode);
if (dwRetCode == STILL_ACTIVE){
BOOL bFlag = TerminateThread(m_hThread, dwRetCode);
}
ResetEvent(m_hStopEvent);
::CloseHandle(m_hThread);
::CloseHandle(m_hStopEvent);
m_hThread = 0;
m_dwThreadID = 0;
m_hStopEvent = NULL;
// m_bStopRequest = FALSE;
break;
case WAIT_FAILED:
AfxMessageBox(TEXT("辆丰角菩"));
goto stop;
// m_bStopRequest = FALSE;
break;
}
}
*/
return TRUE;
}
DWORD WINAPI AThread::ThreadProc(LPVOID lpParam)
{
// CoInitializeEx(NULL, COINIT_MULTITHREADED);
AThread *pThread = static_cast<AThread *>(lpParam);
INT res;
if( pThread != NULL )
{
res = pThread->Run();
}
else
{
res = 0xFFFFFFFF;
}
if( pThread->m_bDeleteMeAfterCompletion )
{
pThread->m_bWaitForThreadToExitWhenStop = FALSE;
delete pThread;
}
// CoUninitialize();
return res;
}
void AThread::NotifyStop()
{
::SetEvent(m_hStopEvent);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -