本文介绍一个线程封装类CThread,这个类中封装了与线程相关操作。将线程封装成类后,线程也具有了对象的概念。线程就更加容易理解和使用。
与线程相关的操作有以下几个方面:1.线程的启动。2.线程的停止。3 线程的处理。4.向线程发送消息。
该类的声明如下:
class CThread
{
public:
CThread(void);
~CThread(void);
public:
virtual BOOL Start(); //启动线程
virtual BOOL Stop(); //停止线程
virtual void Run(); //运行函数,线程反复调用
void EnableSleep(BOOL bEanble); //是否允许线程sleep
virtual void OnThreadMsg(UINT message, WPARAM wParam, LPARAM lParam); //接收到消息
virtual void OnThreadStart(); //当线程启动时,调用一次
virtual void OnQuit(); //当线程结束时,调用一次
BOOL PostThreadMsg(UINT message, WPARAM wParam, LPARAM lParam); //向线程发送消息
BOOL IsStart(); //是否启动
private:
CWinThread *m_pThread;
static UINT ThreadProc(PVOID param);
int m_nSleepTime;
};
当使用线程时,可以定义一个类继承自CThread。重载其中虚函数即可。
线程的定义如下:
#include "Thread.h"
CThread::CThread(void)
{
m_nSleepTime = 1;
m_pThread = NULL;
}
CThread::~CThread(void)
{
}
BOOL CThread::IsStart()
{
return m_pThread != NULL;
}
BOOL CThread::Start()
{
m_pThread = AfxBeginThread(ThreadProc,this);
return m_pThread != NULL;
}
BOOL CThread::PostThreadMsg(UINT message, WPARAM wParam, LPARAM lParam)
{
if( m_pThread )
{
return m_pThread->PostThreadMessageW(message, wParam, lParam);
}
return FALSE;
}
BOOL CThread::Stop()
{
if( m_pThread )
{
return m_pThread->PostThreadMessage(WM_QUIT,0,0);
}
return FALSE;
}
void CThread::OnThreadStart()
{
}
void CThread::OnQuit()
{
}
void CThread::OnThreadMsg(UINT message, WPARAM wParam, LPARAM lParam)
{
}
void CThread::EnableSleep(BOOL bEanble)
{
if (bEanble)
{
m_nSleepTime = 1;
}
else
{
m_nSleepTime = 0;
}
}
void CThread::Run()
{
}
UINT CThread::ThreadProc(PVOID param)
{
CThread *pThread = (CThread*)param;
pThread->OnThreadStart();
MSG msg;
while(1)
{
while( PeekMessage(&msg,NULL,0,0,PM_REMOVE) )
{
switch(msg.message)
{
case WM_QUIT:
{
pThread->OnQuit();
return 0;
}
default:
{
pThread->OnThreadMsg(msg.message,msg.wParam,msg.lParam);
}
continue;
}
}
pThread->Run();
if( pThread->m_nSleepTime > 0 )
{
Sleep(pThread->m_nSleepTime);
}
pThread->m_nSleepTime = 1;
}
return 0;
}
从以上代码可以看出,处理逻辑并不复杂。c++解决问题的思想就是将复杂的逻辑化成一个小的处理逻辑,一一击破。重要的是要学会如何用面向对象方法封装函数。这个封装也许不复杂,但能给使用者带来便易。