一看就懂,一做就会:异步事件同步处理机制
- 函数列表
CreateEvent
ResetEvent
SetEvent
WaitForSingleObject
- 函数介绍
//创建事件,括号中的FALSE表示默认没有事件
HANDLE m_TestEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
ResetEvent(m_TestEvt);//重置事件
SetEvent(m_TestEvt);//设置事件
WaitForSingleObject(m_TestEvt, 3000/*等待时间*/);
-
使用说明
如上四个函数基于WINDOW实现,不同平台之间函数名称存在一定差异,基本思路一致,包括嵌入Linux等其它系统基本一致,函数名围绕事件展开:HANDLE m_TestEvt,思路及顺序:
1、创建事件:CreateEvent;
2、监控/等待事件:WaitForSingleObject;
3、事件发生触发事件:SetEvent;
4、事件多次触发,事件ID会计数,只处理一次事件:设置前复位掉前面的事件:ResetEvent; -
实例代码
DWORD WINAPI HandleEvent(LPVOID pM)
{
int dw = 0;
while(1)
{
// 循环3秒超时等待,也修改成永久等待:
dw = WaitForSingleObject(m_TestEvt, 3000/*等待时间*/);
switch(dw)
{
case WAIT_TIMEOUT:
// 此处3秒会自动超时一次,被执行
break;
case WAIT_FAILED:
break;
case WAIT_OBJECT_0:
AfxMessageBox("SetEvent OK");
break;
default:
break;
}
}
}
void OnUserSendEvent()
{
// 复位事件
ResetEvent(m_TestEvt);
// 设置事件: 触发函数:WaitForSingleObject 此事件 -> WAIT_OBJECT_0
SetEvent(m_TestEvt);
}
void test_main(void)
{
// 创建工作线程
AfxBeginThread((AFX_THREADPROC)HandleEvent, NULL, THREAD_PRIORITY_IDLE);
}
-
应用场景
如上四个函数非常有用,可以提升程序的代码结构,适用于事件触发,类似于等待外部数据、或者数据同步,也可用于模块之间通信, -
依赖基础
对如上几个函数加深理解,需要对操作系统的原理有一定接触,同步的知识点,下期预告:资源互斥,可以有效解决资源访问同步,避免资源访问冲突,实现互斥锁,确保独享资源。
7、感兴趣的题材欢迎指教、批评指正,下期预告:资源互斥
评论留言
只做一看就懂,一做就会的技术,欢迎感兴趣的课题在评论区留言。
8、实例图片
下载代码