⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 athread.cpp

📁 UHF RFID Reader Program
💻 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 + -