一.創(chuàng)建線程函數(shù)
常用的創(chuàng)建線程的函數(shù)是CreateThread,還有MFC中的AfxBeginThread方法.另一種函數(shù)是_beginthreadex,
其實(shí)它在內(nèi)部調(diào)用了CreateThread,在調(diào)用之前_beginthreadex做了很多的工作,從而使得它比CreateThread更
安全.所以一般使用_beginthreadex來創(chuàng)建線程.于是以下使用_beginthreadex函數(shù)來創(chuàng)建線程類.
二.線程類示例
1.Thread.h文件如下:
#ifndef _THREAD_H__
#define _THREAD_H__
#include <process.h>
#include <windows.h>

class CThread


{
public:
public:
CThread();
virtual ~CThread();
BOOL StartThread(); //開始線程
BOOL SuspendThread(); //掛起線程
virtual BOOL Run(); //線程的入口
BOOL StopThread(); //等待線程退出再返回
static unsigned __stdcall start_address( void * obj);

public:
HANDLE m_hthread; //線程句柄
HANDLE m_hEventSuspend; //用于標(biāo)識(shí)線程是工作,還是掛起狀態(tài)
BOOL m_status; //線程狀態(tài),FALSE表示線程退出狀態(tài),TRUE表示未提出狀態(tài)
unsigned m_thrdaddr;
};

#endif/*_THREAD_H__*/


2.Thread.cpp文件如下:
#include "Thread.h"


CThread::CThread()


{
m_hEventSuspend = CreateEvent(0,TRUE,FALSE,NULL);//創(chuàng)建事件句柄,且為非激發(fā)狀態(tài)
m_status = TRUE;

//創(chuàng)建線程
m_hthread = (HANDLE)_beginthreadex(NULL,0,CThread::start_address,this,0,&m_thrdaddr);
}

CThread::~CThread()


{
CloseHandle(m_hEventSuspend);
CloseHandle( m_hthread );
}

BOOL CThread::StartThread()


{
return SetEvent(m_hEventSuspend);
}

BOOL CThread::SuspendThread()


{
return ResetEvent(m_hEventSuspend);
}

BOOL CThread::Run()


{
return TRUE;
}

BOOL CThread::StopThread()


{
m_status = FALSE;//將線程狀態(tài)置為退出
StartThread(); //把線程喚醒,以免掛死在休眠處
WaitForSingleObject(m_hthread,INFINITE); //等待線程退出

return TRUE;
}

unsigned __stdcall CThread::start_address( void * obj)


{
CThread* pthread = static_cast<CThread*>(obj);

while(pthread->m_status)

{
WaitForSingleObject(pthread->m_hEventSuspend,INFINITE);//控制掛起,運(yùn)行
//如果自動(dòng)退出
if (!pthread->Run())
break;
}
_endthreadex(0);

return 0;
}


三.線程類的使用
1. 新建一個(gè)win32控制臺(tái)工程,代碼如下:
#include "Thread.h"
#include <iostream>
#include <conio.h>


using namespace std;


class CMyThread:public CThread


{
public:
BOOL Run()

{
cout<<"hello!"<<endl;
Sleep(5000);
return TRUE;
}
};

int main(int argc,char *argv[])


{
//創(chuàng)建線程
CMyThread mythread;

//讓線程啟動(dòng)
mythread.StartThread();
//按任意鍵,線程掛起
_getch();
mythread.SuspendThread();
cout<<"thread suspend"<<endl;

//接任意鍵,線程停止
_getch();
mythread.StopThread();
cout<<"thread stop"<<endl;

//按任意鍵,程序退出
_getch();

return 0;
}

