一、概念
创建事件:
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置为有信号状态;文章来源:https://www.toymoban.com/news/detail-545179.html
主函数在启动两个线程之后等待1秒之后将h_event2置为有信号状态,此时两个线程都应已查询三次信号量状态并将等待情况输出,在h_event2有信号之后线程2会结束,并在等待350ms将事件1修改,在此期间线程1会再次查询,同时主函数会继续执行,再while循环中查询两个线程的状态,当两个并未都结束时每隔150ms输出一次信息。文章来源地址https://www.toymoban.com/news/detail-545179.html
到了这里,关于C++MFC创建事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!