转:http://tech.ddvip.com/2009-09/1254284559134869.html
函数CreateEvent声明如下:
WINBASEAPI
__out
HANDLE
WINAPI
CreateEventA(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCSTR lpName
);
WINBASEAPI
__out
HANDLE
WINAPI
CreateEventW(
__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
__in BOOL bManualReset,
__in BOOL bInitialState,
__in_opt LPCWSTR lpName
);
#ifdef UNICODE
#define CreateEvent CreateEventW
#else
#define CreateEvent CreateEventA
#endif // !UNICODE
lpEventAttributes是事件的属性。
bManualReset是指事件手动复位,还是自动复位状态。
bInitialState是初始化的状态是否处于有信号的状态。
lpName是事件的名称,如果有名称,可以跨进程共享事件状态。
调用这个函数的例子如下:
#pragma once
//线程类。
//蔡军生 2007/09/23 QQ:9073204
class CThread
{
public:
CThread(void)
{
m_hThread = NULL;
m_hEventExit = NULL;
}
virtual ~CThread(void)
{
if (m_hThread)
{
//删除的线程资源。
::CloseHandle(m_hThread);
}
if (m_hEventExit)
{
//删除事件。
::CloseHandle(m_hEventExit);
}
}
//创建线程
HANDLE CreateThread(void)
{
//创建退出事件。
m_hEventExit = ::CreateEvent(NULL,TRUE,FALSE,NULL);
if (!m_hEventExit)
{
//创建事件失败。
return NULL;
}
//创建线程。
m_hThread = ::CreateThread(
NULL, //安全属性使用缺省。
0, //线程的堆栈大小。
ThreadProc, //线程运行函数地址。
this, //传给线程函数的参数。
0, //创建标志。
&m_dwThreadID); //成功创建后的线程标识码。
return m_hThread;
}
//等待线程结束。
void WaitFor(DWORD dwMilliseconds = INFINITE)
{
//发送退出线程信号。
::SetEvent(m_hEventExit);
//等待线程结束。
::WaitForSingleObject(m_hThread,dwMilliseconds);
}
protected:
//
//线程运行函数。
//蔡军生 2007/09/21
//
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
//转换传送入来的参数。
CThread* pThread = reinterpret_cast<CThread *>(lpParameter);
if (pThread)
{
//线程返回码。
//调用类的线程处理函数。
return pThread->Run();
}
//
return -1;
}
//线程运行函数。
//在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
//蔡军生 2007/09/25
virtual DWORD Run(void)
{
//输出到调试窗口。
::OutputDebugString(_T("Run()线程函数运行\r\n"));
//线程循环。
for (;;)
{
DWORD dwRet = WaitForSingleObject(m_hEventExit,0);
if (dwRet == WAIT_TIMEOUT)
{
//可以继续运行。
TCHAR chTemp[128];
wsprintf(chTemp,_T("ThreadID=%d\r\n"),m_dwThreadID);
::OutputDebugString(chTemp);
//目前没有做什么事情,就让线程释放一下CPU。
Sleep(10);
}
else if (dwRet == WAIT_OBJECT_0)
{
//退出线程。
::OutputDebugString(_T("Run() 退出线程\r\n"));
break;
}
else if (dwRet == WAIT_ABANDONED)
{
//出错。
::OutputDebugString(_T("Run() 线程出错\r\n"));
return -1;
}
}
return 0;
}
protected:
HANDLE m_hThread; //线程句柄。
DWORD m_dwThreadID; //线程ID。
HANDLE m_hEventExit; //线程退出事件。
};
上面在第35行创建线程退出事件,第95行检查事件是否可退出线程运行,第58行设置退出线程的事件。