CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
事件对象就像一个开关:它只有两种状态---开和关。当一个事件处于”开”状态,我们称其为”有信号”,否则称为”无信号”。可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该线程睡眠,这样该线程占用的CPU时间就比较少。
产生事件对象的函数如下:
(1)CreateEvent
函数原型:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
BOOL bManualReset, // 复位方式
BOOL bInitialState, // 初始状态
LPCTSTR lpName // 对象名称
);
该函数创建一个Event同步对象,如果CreateEvent调用成功的话,会返回新生成的对象的句柄,否则返回NULL。
lpEventAttributes:一般为NULL
bManualReset:指定将事件对象创建成手动复原还是自动复原。如果是TRUE(手动),那么就算等待线程处理了,必须用ResetEvent函数来手工才能将事件的状态复原到无信号状态。如果设置为FALSE(自动),当事件被一个等待线程处理并释放以后,系统会自动将事件状态复原为无信号状态。所以两者可用于不同的场合,自动复位的需要每次的事件信号才会执行,而手动复位的则可以一直运行。
bInitialState:指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
lpName:指定事件的对象的名称,在OpenEvent函数中可能使用。
示例代码:// 创建一个有名的,不能被继承的,手动复原,初始状态是无信号状态的事件对象:
Handle h = CreateEvent(NULL,TRUE,FALSE,“MyEvent”);
一个Event被创建以后,可以用OpenEvent()API来获得它的Handle,用CloseHandle()来关闭它,用SetEvent()或PulseEvent()来设置它使其有信号,用ResetEvent()来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号.。
(2)SetEvent
函数原型:
BOOL WINAPI SetEvent(
__in HANDLE hEvent
);
设置事件的状态为有标记。如果事件创建时是手工的,此事件将保持有标记直到调用ResetEvent。如果事件是自动的,此事件将保持有标记,直到一个线程被释放,系统将设置事件的状态为无标记。
(3)ResetEvent
函数原型:
BOOL ResetEvent(
HANDLE hEvent
);
hEvent 指向事件对象的句柄,由 CreateEvent or OpenEvent 函数返回。这个句柄需要拥有EVENT_MODIFY_STATE 访问权限。函数成功,返回非0值,否则返回0值,可以调用GetLastError得到错误的详细信息。
这个函数用于手动重置事件对象。手动重置的对象在线程释放后必须手动置为无信号状态。自动重置的事件对象在一个等待它成功的线程释放后会自动变为无信号状态。 重置一个无信号的事件对象没有任何效果。
(4)WaitForSingleObject
函数原型:
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果事件是有信号状态返回WAIT_OBJECT_0,如果事件超过dwMilliseconds值但事件还是无信号状态,则返回WAIT_TIMEOUT。之前线程会一直阻塞程序在该语句处。
上述文字转载自:https://blog.csdn.net/gateway6143/article/details/35215595
eg:
#include <stdio.h>
#include <windows.h>
#include <process.h>
void Log(char* pszData)
{
DWORD dwProcessId = GetCurrentProcessId();
DWORD dwThreadId = GetCurrentThreadId();
printf("pid=0x%08X,tid=0x%08X, %s\r\n", dwProcessId, dwThreadId, pszData);
}
HANDLE g_Event = NULL;
unsigned int __stdcall ThreadFunc(void* pParam)
{
Log("ThreadFunc begin");
Log("ThreadFunc WaitForSingleObject...");
WaitForSingleObject(g_Event, INFINITE);
Log("wait 10s...");
Sleep(10000);
return 0;
}
int main(int argc, char* argv[])
{
Log("main begin");
Log("create event");
// 创建一个手动复原,无信号,无名称的事件
g_Event = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, NULL);
Log("wait 10s...");
Sleep(10000);
Log("set event");
SetEvent(g_Event);
DWORD dwExitCode = 0;
GetExitCodeThread(hThread1, &dwExitCode);
if (STILL_ACTIVE == dwExitCode)
{
Log("WaitForSingleObject enter");
WaitForSingleObject(hThread1, INFINITE);
Log("WaitForSingleObject leave");
// 手动重置的事件在线程释放后需要手动置为无信号状态
ResetEvent(g_Event);
}
Log("main end");
getchar();
return 0;
}
CreateEvent、SetEvent、ResetEvent和WaitForSingleObject相关推荐
- CreateEvent/SetEvent/ResetEvent和WaitForSingleObject
1.CreateEvent 是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. 函功能描述:创建或打开一个命名的或无名的事件对象. HANDLE m_hExit; m_hExit= ...
- CreateEvent() SetEvent() ResetEvent() 进程互斥
首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面. CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象. EVENT有两种状态 ...
- c++ 线程中CreateEvent SetEvent/ResetEvent WaitForSingleObject的使用
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 BOOL bManualReset, // 复位方式, ...
- CreateEvent SetEvent ResetEvent
CreatEvent():创建一个事件对象 SetEvent():把指定事件对象的状态设置为发信号状态 ResetEvent():把指定事件对象的状态设置为不发信号状态 函数CreateEvent创 ...
- 线程中CreateEvent和SetEvent和ReSetEvent及WaitForSingleObject的用法
概述 首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面. CreateEvent:创建或打开一个命名的或无名的事件对象. EVENT有两种状态:发信号 ...
- C++事件SetEvent,ResetEvent的使用
一.概念 创建事件: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可 ...
- 【CreateEvent与SetEvent/ResetEvent】
CreateEvent:创建Window事件,创建或打开一个命名的或无名的事件对象. 创建的事件有两种状态:发送信号和不发送信号: SetEvent:将事件设置为发送信号 ResetEvent:将事件 ...
- C++事件的建立和使用SetEvent,ResetEvent
一.事件是很常用的多线程同步互斥机制 函数原型如下所示,一共四个参数: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // ...
- SetEvent/ResetEvent
该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,以下是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济.行业趋势.心灵文章等,有兴趣的朋友可以踩 ...
最新文章
- 在IDE中刷LeetCode,编码调试一体化,刷题效率直线up!
- mysql sql 事务写作_mysql中的事务
- EXCEL中数据的自动匹配主要包含的内容
- Windows 2003 服务器播放FLV的问题解决
- stm32入门c语言下载,STM32入门C语言详解.docx
- windows7不支持AllocateAndGetTcpExTableFromStack
- .NET程序员走向高端必读书单汇总
- 关于javafx支持IOS、android等智能手机解决方案
- java关闭文本_如何更优雅的关闭java文本、网络等资源
- Gamma Correction
- c语言中输出值作用,printf在c语言中什么意思
- Swager登陆跳转了login登陆页面
- 浅析小米登录/注册页面(原生)
- js a标签下载文档
- signature=9b2caa13f2468eba05d2d57d9a88606d,【音响聚焦】顶级Hi-End音响发烧器材介绍(功放篇)...
- C++使用curl下载文件(post请求)
- 互联网的996与华为的惊世骇俗
- python爬虫利用线程池下载视频
- Banner——轮播图
- 带宽与码元的关系_1.简单谈谈码元速率、数据速率、信道带宽、信道容量、载波几个概念...