zoukankan      html  css  js  c++  java
  • Windows API——CREATEEVENT——创建事件

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

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

    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)处等待。

    #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);
    }

     

  • 相关阅读:
    Linux实战教学笔记16:磁盘原理
    Linux实战教学笔记15:用户管理初级(下)
    Linux实战教学笔记14:用户管理初级(上)
    Linux实战教学笔记13:定时任务补充
    Linux实战教学笔记12:linux三剑客之sed命令精讲
    Linux实战教学笔记11:linux定时任务
    Linux实战教学笔记10:正则表达式
    Linux实战教学笔记09:通配符
    Linux实战教学笔记08:Linux 文件的属性(下半部分)
    Linux实战教学笔记08:Linux 文件的属性(上半部分)
  • 原文地址:https://www.cnblogs.com/MrYuan/p/5239001.html
Copyright © 2011-2022 走看看