C++MFC创建事件

该文介绍了WindowsAPI中创建和使用事件对象进行线程同步的方法,包括CreateEvent、SetEvent、ResetEvent和WaitForSingleObject函数的运用。通过代码实例展示了两个线程如何等待和触发事件,以及事件的手动重置和自动重置特性。

一、概念

创建事件:

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正在等待event1\n” << 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正在等待event2\n” << 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输出一次信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

观天小蚁

需要广大市民的支持哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值