xthread.cpp

来自「HTTP 搜索代码」· C++ 代码 · 共 123 行

CPP
123
字号
#include "stdafx.h"
#include "xthread.h"
#include <stdlib.h>

xThread::xThread(void) : m_dwThreadID(0), m_hThread(INVALID_HANDLE_VALUE), 
m_bTerminated(FALSE), m_bIsSuspended(FALSE), m_lpParam( NULL )
{
}

xThread::~xThread(void)
{
	if (m_hThread != INVALID_HANDLE_VALUE)
	{
		if (m_bIsSuspended)
			Resume();
		Terminate();
		WaitFor();
	}
}

void xThread::WaitFor(void)
{
	//to do: handle SendMessage deadlock
	if (m_hThread != INVALID_HANDLE_VALUE)
	{
		WaitForSingleObject(m_hThread, INFINITE);
	}
}

BOOL xThread::Start(LPVOID lpParam, BOOL bSuspended)
{
	if( m_hThread != INVALID_HANDLE_VALUE )
		return FALSE;
	unsigned int dwThreadID;
	int nFlag = 0;
	m_lpParam = lpParam;
	if (bSuspended)
	{
		nFlag = CREATE_SUSPENDED;
		m_bIsSuspended = TRUE;
	}
	else
		m_bIsSuspended = FALSE;

	HANDLE hThread = (HANDLE)CreateThread(NULL,
		0,
		(LPTHREAD_START_ROUTINE)ThreadProc,
		(void*)this,
		nFlag,
		(LPDWORD)&dwThreadID);
	if (hThread == INVALID_HANDLE_VALUE)
		return FALSE;
	m_dwThreadID = dwThreadID;
	m_hThread = hThread;
	//   m_bTerminated = FALSE;
	return TRUE;
}

BOOL xThread::IsSuspended()
{
	return m_bIsSuspended;
}

BOOL xThread::Resume(void)
{
	if (ResumeThread(m_hThread) != (DWORD)-1)
	{
		m_bIsSuspended = FALSE;
		return TRUE;
	}
	else
		return FALSE;
}

BOOL xThread::Suspend(void)
{
	if (SuspendThread(m_hThread) != (DWORD)-1)
	{
		m_bIsSuspended = TRUE;
		return TRUE;
	}
	else
		return FALSE;
}

BOOL xThread::IsTerminated(void)
{
	return m_bTerminated;
}

BOOL xThread::IsStarted(void)
{
	return m_hThread != INVALID_HANDLE_VALUE;
}

void xThread::Terminate(void)
{
//	ODS("FSDAF");
	::InterlockedExchange((LONG *)&m_bTerminated,TRUE);
}

unsigned WINAPI xThread::ThreadProc(LPVOID pParam)
{
	xThread* pThread = (xThread*)pParam;
	::InterlockedExchange((LONG *)&(pThread->m_bTerminated),FALSE);
	//	初始化随机数种子
	srand( GetCurrentThreadId() | timeGetTime() );
	try
	{
		pThread->Execute(pThread->m_lpParam);
	}
	catch(...)
	{
		throw;
	}
	pThread->OnTerminated();
	CloseHandle(pThread->m_hThread);
	pThread->m_hThread = INVALID_HANDLE_VALUE;
	pThread->m_dwThreadID = 0;
	pThread->m_bTerminated = TRUE;
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?