实例——CEvent事件
头文件关键代码:
// MFCEventDlg.h : 头文件
#pragma once
#define WM_MSG WM_USER+1
typedef struct THREAD_PARAM
{
HWND hWnd;
int nData;
CEvent* pEvent;
}_THREAD_PARAM;
UINT ThreadFun(LPVOID pParam);
class CMFCEventDlg : public CDialogEx
{
//...
//定义的成员变量
THREAD_PARAM mThreadParam;
CWinThread* pThread;
// ...
};
cpp文件关键代码:
// MFCEventDlg.cpp : 实现文件
CMFCEventDlg::CMFCEventDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMFCEventDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pThread=NULL;
mThreadParam.nData=0;
mThreadParam.pEvent=new CEvent(TRUE,FALSE,L"eventDlg");
//new CEvent(BOOL bInitiallyOwn = FALSE,BOOL bManualReset = FALSE,LPCTSTR lpszName = NULL,);
//bInitiallyOwn:如果为TRUE,CMultilock或CSingleLock对象的线程可用;如果为FALSE,所有要访问资源的线程必须等待。
//bManualReset:如果为TRUE,指定事件是一个手工事件,否则事件是一个自动事件。
//lpszName:CEvent事件的名字
//要访问或释放一个CEvent对象,可建立一个CSingleLock或CMultiLock对象并调用其Lock和Unlock成员函数。 要将CEvent对象的状态改为已标记(无须等待的线程),可调用SetEvent或PulseEvent。要设置一个CEvent对象为无标记(必须等待的线程),可调用ResetEvent。
}
CMFCEventDlg::~CMFCEventDlg()
{
if (pThread)
{
mThreadParam.pEvent->SetEvent();//设置事件
WaitForSingleObject(pThread->m_hThread,INFINITE);//等待线程结束
delete pThread;
pThread=NULL;
}
if (mThreadParam.pEvent)
{
delete mThreadParam.pEvent;
mThreadParam.pEvent=NULL;
}
}
BEGIN_MESSAGE_MAP(CMFCEventDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PA