C++MFC创建事件

一、概念

创建事件:

HANDLE CreateEvent(

LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL
 BOOL bManualReset, // 手动/自动
  // TRUE:表示手动,在WaitForSingleObject后必须手动调用ResetEvent清除信号
  // FALSE:表示自动,在WaitForSingleObject后,系统自动清除事件信号
 BOOL bInitialState, //初始状态,FALSE为无信号,TRUE为有信号
 LPCTSTR lpName //事件的名称
);

SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。

可使用WaitForSingleObject或者WaitForMultipleObjects来等待事件。

二、代码实例

#include “stdafx.h”
#include
#include
#include <windows.h>
using namespace std;

HANDLE h_event1 = NULL;
HANDLE h_event2 = NULL;
DWORD WINAPI FunProc1(LPVOID lpParameter);
DWORD WINAPI FunProc2(LPVOID lpParameter);

DWORD WINAPI FunProc1(LPVOID lpParameter)
{
cout << “线程1开始运行。n” << endl;
while (WAIT_OBJECT_0 != WaitForSingleObject(h_event1, 300))
{
cout << “线程1正在等待event1n” << endl;
}
cout << “线程1等到了event1,线程1结束。n” << endl;
ResetEvent(h_event1);
return 0;
}

DWORD WINAPI FunProc2(LPVOID lpParameter)
{
cout << “线程2开始运行。n” << endl;
while (WAIT_OBJECT_0 != WaitForSingleObject(h_event2, 300))
{
cout << “线程2正在等待event2n” << endl;
}
cout << “线程2等到了event2,线程2结束。n” << endl;
Sleep(350);
SetEvent(h_event1);
return 0;
}

int main(int argc, char** argv)
{
h_event1 = CreateEvent(NULL, true, false, _T(“event_one”));
h_event2 = CreateEvent(NULL, false, false, _T(“event_two”));
HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, FunProc1, NULL, 0, NULL);
HANDLE hThread2;
hThread2 = CreateThread(NULL, 0, FunProc2, NULL, 0, NULL);
Sleep(1000);
SetEvent(h_event2);
while (WaitForSingleObject(hThread1, 150) != WAIT_OBJECT_0 || WaitForSingleObject(hThread2, 150) != WAIT_OBJECT_0)
{
cout << “线程还没有结束,主程序等了150ms。n” << endl;
}
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(h_event1);
CloseHandle(h_event2);
system(“pause”);
}
在主函数中,创建了两个事件对象,h_event1与h_event2;其中h_event1第二个参数为true,表示其在WaitForSingleObject后必须手动调用ResetEvent清除信号,h_event1第二个参数为false,表示其在WaitForSingleObject后系统自动清除事件信号,两个事件对象创建时第三个参数都为false,表示初始都为无信号状态;

接下来启动两个线程,第一个线程的线程函数中每隔300ms查询一次h_event1的状态,直到h_event1为有信号停止,并将h_event1置为无信号状态;第一个线程的线程函数中每隔300ms查询一次h_event2的状态,直到h_event2为有信号停止,并在h_event2有信号之后在等待350ms之后将h_event1置为有信号状态;

主函数在启动两个线程之后等待1秒之后将h_event2置为有信号状态,此时两个线程都应已查询三次信号量状态并将等待情况输出,在h_event2有信号之后线程2会结束,并在等待350ms将事件1修改,在此期间线程1会再次查询,同时主函数会继续执行,再while循环中查询两个线程的状态,当两个并未都结束时每隔150ms输出一次信息。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>