事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:
(1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
(2)自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
参数1:SECURITY_ATTRIBUTES结构指针,可为NULL
参数2:// 手动/自动
// TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号
// FALSE:在WaitForSingleObject后,系统自动清除事件信号
参数3://初始状态,是否发信号 ,false不发信号,true,发信号(返回值WaitForSingleObject(h_event1, 300)=WAIT_OBJECT_0)
参数4://事件的名称
CreateEvent(NULL, true, false, _T("event_one"));
参考https://blog.csdn.net/LL596214569/article/details/89163734
简单得用法,SetEvent可以控制线程是否继续执行,或者卡死多少秒
使用CreateEvent,创建,WaitForSingleObject 方法卡死,
程序如下,如果输入0,SetEvent(h_event1);继续执行,
输入1,卡死在程序中WaitForSingleObject ,等待3秒,执行一下继续卡死
代码如下:
#include <iostream>
#include <string>
#include <windows.h>
#include <tchar.h>
using namespace std;
HANDLE h_event1 = NULL;
DWORD WINAPI FunProc1(LPVOID lpParameter);
DWORD WINAPI FunProc1(LPVOID lpParameter)
{
cout << "线程1开始运行。\n" << endl;
while (true) {
while (WAIT_TIMEOUT == WaitForSingleObject(h_event1, 3000))
{
cout << "线程1event1等待超时\n" << endl;
Sleep(500);
}
cout << "线程1等到了event1,线程1结束。\n" << endl;
Sleep(500);
}
return 0;
}
int main(int argc, char** argv)
{
/* 事件(Event)是WIN32提供的最灵活的线程间同步方式,事件可以处于激发状态(signaled or true)或未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可分为两类:
(1)手动设置:这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
(2)自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
参数1:SECURITY_ATTRIBUTES结构指针,可为NULL
参数2:// 手动/自动
// TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号
// FALSE:在WaitForSingleObject后,系统自动清除事件信号
参数3://初始状态,是否发信号 ,false不发信号,true,发信号(返回值WaitForSingleObject(h_event1, 300)=WAIT_OBJECT_0)
参数4://事件的名称
*/
h_event1 = CreateEvent(NULL, true, true, _T("event_one"));
HANDLE hThread1;
hThread1 = CreateThread(NULL, 0, FunProc1, NULL, 0, NULL);
string a = "";
while (true) {
cin >> a;
if (a == "1") {
ResetEvent(h_event1);
}
else {
SetEvent(h_event1);
}
}
CloseHandle(hThread1);
CloseHandle(h_event1);
system("pause");
}