前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CreateEvent( )——创建事件函数「建议收藏」

CreateEvent( )——创建事件函数「建议收藏」

作者头像
全栈程序员站长
发布2022-09-07 11:33:34
5260
发布2022-09-07 11:33:34
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

/*************************************************************************************************** *   发布日期: *   更新日期:2017-11-13 17:05:31 *   进度: *   作者:Luotian *   备注:事件 ***************************************************************************************************/

事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象。事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑

CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,线程锁定方面.

代码语言:javascript
复制
HANDLE CreateEvent(   
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性   
BOOL bManualReset,   // 复位方式  
BOOL bInitialState,   // 初始状态   
LPCTSTR lpName     //对象名称   
);

lpEventAttributes:   

[输入]一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。 Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果lpEventAttributes是NULL,事件将获得一个默认的安全符。  

bManualReset:   

[输入]指定将事件对象创建成手动复原还是自动复原。 如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。 如果设置为FALSE,当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。   

bInitialState:   

[输入]指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。  

lpName:   

[输入]指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。 如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。 这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。 如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。 如果lpName为NULL,将创建一个无名的事件对象。

CEvent::SetEvent()把对象设置为有信号状态,释放等待的线程。 CEvent::ResetEvent()把对象设置为无信号状态,程序在WaitForSingleObject(hHandle,INFINITE)处等待。

代码语言:javascript
复制
#include <iostream>
#include <afx.h>
#include <process.h>
using namespace std;

HANDLE hUp;
CRITICAL_SECTION g_data;
int arr[10];
HANDLE hEvent; //使用手动重置为无信号状态,初始化时有信号状态

UINT __stdcall Add(LPVOID lParam)
{
    DWORD dReturn = WaitForSingleObject(hEvent,INFINITE); //有信号时才能得到
    for (int i = 0; i<10;i++ )
    {
       arr[i]=i;//0-9
    }
    for (int i = 0;i < 10; i++)
    {
       cout<<arr[i]<<" ";
    }
    cout<<endl;
    ResetEvent(hEvent);//重置为无信号状态
    return 1;
}

UINT __stdcall Add2(LPVOID lParam)

{ 
    for (int i = 0; i<100 ;i++)
    {
       arr [i] = i+100;//10`1
    }
    for (int i = 0;i < 10; i++)
    {
       cout<<arr[i]<<" ";
    }
    cout<<endl;
    SetEvent(hEvent);

   //MFC中,CEvent g_event; g_event.SetEvent();
    return 1;
}
int main()
{
    hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
    hUp=(HANDLE)_beginthreadex(NULL, 0, Add, NULL, NULL, 0);
    hUp=(HANDLE)_beginthreadex(NULL, 0, Add2, NULL, NULL, 0);
    Sleep(5000);
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154248.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • lpEventAttributes:   
  • bManualReset:   
  • bInitialState:   
  • lpName:   
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档