c++ 线程基类 实现 笔记

class GThread {

public:
	GThread();
	virtual ~GThread();

public:
	bool IsExit();

public:
	virtual bool Start();
	virtual void Stop();

protected:
	virtual void run() = 0;

private:
	static DWORD WINAPI ThreadRoute(LPVOID lpParam);

public:
	HANDLE m_hThread;

protected:
	bool m_bRunning;
	std::string m_pName;
	mutex mThread_mux;
};


GThread ::GThread ()
{
m_bRunning=false;
m_pName="";
m_hThread = INVALID_HANDLE_VALUE;
}
GThread ::~GThread ()
{

}
bool GThread ::IsExit()
{
return m_bRunning;

}

bool GThread ::Start()
{

DWORD ID=0;
mThread_mux.lock();
m_hThread = ::CreateThread(NULL, 0, GThread::ThreadRoute, this, 0, &dwThreadId);
	if (INVALID_HANDLE_VALUE == m_hThread) {
#if DEBUG_GTHREAD
		WriteLogE("Fail to start thread : %s.\n", m_pName.c_str());
#endif
		mThread_mux.unlock();
		return FALSE;
	}
}

bool GThread ::stop()
{
mThread_mux.lock();
	m_bRunning = false;
	if (INVALID_HANDLE_VALUE != m_hThread){
		if (WAIT_FAILED == WaitForSingleObject(m_hThread, INFINITE)) {
#if DEBUG_GTHREAD
			WriteLogE("Terminate thread : %s.\n", m_pName.c_str());
#endif
			TerminateThread(m_hThread, 0);
		}
	}
	CloseHandle(m_hThread);
	m_hThread = INVALID_HANDLE_VALUE;
}
DWORD GThread::ThreadRoute(LPVOID lpParam)
{
	GThread *self = reinterpret_cast<GThread *>(lpParam);
#if DEBUG_GTHREAD
	WriteLogD("Thread : %s is running.\n", self->m_pName.c_str());
#endif
	self->run();
	self->m_bRunning = FALSE;
#if DEBUG_GTHREAD
	WriteLogD("Thread : %s exited.\n", self->m_pName.c_str());
#endif
	return 0;
}

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);

lpThreadAttributes:
这是一个指向 SECURITY_ATTRIBUTES 结构的指针,用于定义新线程的安全性属性。可以为 NULL,表示新线程不继承调用线程的安全描述符。
dwStackSize:
指定新线程的初始栈大小。如果为0,则新线程使用默认大小。通常情况下,使用0以便系统自动为线程选择默认大小的栈空间。
lpStartAddress:
这是一个指向线程函数的指针,即新线程将要执行的函数的地址。线程函数的定义形式为 DWORD WINAPI ThreadFunc(LPVOID lpParam)。
lpParameter:
这是一个指向线程函数的参数的指针。可以通过该参数将数据传递给新线程。它的类型为 LPVOID,因此可以传递任何类型的数据,需要在线程函数内部进行适当的类型转换。
dwCreationFlags:
指定附加的标志来控制线程的创建方式。可以使用一些标志位进行控制,例如 CREATE_SUSPENDED 用于创建挂起的线程,直到调用 ResumeThread。
lpThreadId:
这是一个指向 DWORD 的指针,用于接收新创建线程的唯一标识符(线程ID)。可以为 NULL,表示不需要获取线程ID。

posted @ 2024-06-14 17:02  耀耀爱学习  阅读(37)  评论(0)    收藏  举报