windows操作系统的Event

本文介绍了Windows操作系统中的事件对象(Event)的创建、管理及其在进程间通信中的应用。通过CreateEvent函数创建事件,参数包括手动复位或自动复位、初始状态等。SetEvent和ResetEvent分别用于设置和清除事件信号。使用WaitForSingleObject进行等待,OpenEvent用于跨进程获取事件句柄,CloseHandle用于关闭。当函数成功,返回事件对象的句柄,失败则返回NULL,并可通过GetLastError获取错误信息。

CreateEvent、创建事件:

函数原型:

HANDLE     CreateEvent(

        LPSECURITY_ATTRIBUTES     lpEventAttributes,         //    NULL   
        BOOL     bManualReset,                                                 //    人工复位 
        BOOL     bInitialState,                                                      //    初始时的信号量   
        LPCTSTR     lpName                                                       //    信号量名称   
    );   

SetEvent,ResetEvent  分别将EVENT置为发信号与不发信号的状态。
配合使用WaitForSingleObject来等待事件触发,主要用在进程间简单的通信,只用于是否。

其中有四个参数:

第一个参数pEventAttributes 一般不用它,置为NULL。

第二个参数 BOOL bManualReset  。

为TRUE表示创建的event由人工复位,一旦Event被设置为有信号,则一直会等到ResetEvent()API被调用后,才会恢复为无信号。

设为FALSE,表示创建的event是自动复位。

第三个参数 BOOL bInitialState,  表示初始时的信号量有无,为TRUE 的时,表示有信号,反之无信号。

第四个参数LPCTSTR lpName ,  信号量名称。

监测是否复位的方法是用waitForSingleObject探测该event的信号的有无,为TRUE 的时候,表示有信号,为FALSE为无信号。


EVENT是内核对象,Event被创建后,可以跨进程的用OpenEvent()   这个API来获得它的Handle,用CloseHandle() 可以关闭它,用SetEvent()或PulseEvent()来设置它的状态(只有开关两个状态),使其有信号;用ResetEvent() 来使其无信号,用WaitForSingleObject()或WaitForMultipleObjects()来等待其变为有信号。

返回值
If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero. 
If the function fails, the return value is NULL. To get extended error information, call GetLastError. 

不要重复CreatEvent,即使重复CreatEvent,也会得到一个新的Handle,注意避免句柄泄漏。

#include "stdafx.h"
 
HANDLE ghEvents[2];
DWORD WINAPI ThreadProc(LPVOID);
 
 
int main(void)
{
    HANDLE hThread;
    DWORD i, dwEvent, dwThreadID;
 
    // Create two event objects
 
    for (i = 0; i < 2; i++)
    {
        ghEvents[i] = CreateEvent(
            NULL,   // default security attributes
            FALSE,  // auto-reset event object
            FALSE,  // initial state is nonsignaled
            NULL);  // unnamed object
        if (ghEvents[i] == NULL)
        {
            printf("CreateEvent error: %d\n", GetLastError());
            ExitProcess(0);
        }
    }
    // Create a thread
    hThread = CreateThread(
        NULL,         // default security attributes
        0,            // default stack size
        (LPTHREAD_START_ROUTINE)ThreadProc,
        NULL,         // no thread function arguments
        0,            // default creation flags
        &dwThreadID); // receive thread identifier
    if (hThread == NULL)
    {
        printf("CreateThread error: %d\n", GetLastError());
        return 1;
    }
    // Wait for the thread to signal one of the event objects
    dwEvent = WaitForMultipleObjects(
        2,           // number of objects in array
        ghEvents,     // array of objects
        FALSE,       // wait for any object
        5000);       // five-second wait
                     // The return value indicates which event is signaled
    switch (dwEvent)
    {
        // ghEvents[0] was signaled
    case WAIT_OBJECT_0 + 0:
        // TODO: Perform tasks required by this event
        printf("First event was signaled.\n");
        break;
        // ghEvents[1] was signaled
    case WAIT_OBJECT_0 + 1:
        // TODO: Perform tasks required by this event
        printf("Second event was signaled.\n");
        break;
    case WAIT_TIMEOUT:
        printf("Wait timed out.\n");
        break;
        // Return value is invalid.
    default:
        printf("Wait error: %d\n", GetLastError());
        ExitProcess(0);
    }
    // Close event handles
    for (i = 0; i < 2; i++)
        CloseHandle(ghEvents[i]);
    return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
    // lpParam not used in this example
    UNREFERENCED_PARAMETER(lpParam);
    // Set one event to the signaled state
    if (!SetEvent(ghEvents[1]))
    {
        printf("SetEvent failed (%d)\n", GetLastError());
        return 1;
    }
    return 0;
}

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值