首先建立一个MyThread的基类,提供基本的功能:
#pragma once
#include <Windows.h>
class MyThread
{
public:
MyThread();
virtual ~MyThread();
bool Start();
bool Join();
bool Detach();
DWORD Self();
private:
static DWORD WINAPI Run(PVOID pObj);
virtual DWORD RumImpl() = 0;
protected:
static bool m_running;
static bool m_detached;
private:
DWORD m_tid;
HANDLE m_HANDLE;
};
#include "MyThread.h"
#include <cstdio>
#include <cstdlib>
bool MyThread::m_running = false;
bool MyThread::m_detached = false;
MyThread::MyThread()
: m_tid(0)
, m_HANDLE(NULL)
{
}
MyThread::~MyThread()
{
if (m_running)
{
WaitForSingleObject(m_HANDLE, INFINITE);
m_running = false;
}
if (NULL != m_HANDLE)
{
CloseHandle(m_HANDLE);
}
}
bool MyThread::Start()
{
if (NULL != m_HANDLE)
{
printf("Thread opened.\n");
return false;
}
m_HANDLE = CreateThread(NULL, 0, Run, this, 0, &m_tid);
if (NULL == m_HANDLE)
{
printf("CreateThread Error.\n");
return false;
}
return true;
}
bool MyThread::Join()
{
WaitForSingleObject(m_HANDLE, INFINITE);
return true;
}
bool MyThread::Detach()
{
return CloseHandle(m_HANDLE);
}
DWORD MyThread::Self()
{
return m_tid;
}
DWORD WINAPI MyThread::Run( PVOID pObj )
{
m_running = true;
MyThread* lpThread = (MyThread*)pObj;
return lpThread->RumImpl();
}
然后,定制自己的AllenThread:
#pragma once
#include "mythread.h"
class AllenThread :
public MyThread
{
public:
AllenThread();
virtual ~AllenThread();
virtual DWORD RumImpl();
};
#include "AllenThread.h"
#include <cstdio>
AllenThread::AllenThread(void)
{
}
AllenThread::~AllenThread(void)
{
}
DWORD AllenThread::RumImpl()
{
printf("Yes.It's Allen's Thread.\n");
m_running = false;
return 0;
}
写的还很粗糙,之后慢慢完善。