`

OpenEvent的使用注意点

    博客分类:
  • C++
 
阅读更多
我的测试代码如下
    HANDLE hTest = CreateEvent(NULL, FALSE, FALSE, "Global\\Hello"); //Handle 1
    HANDLE hGetEvent1 = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\Hello"); //Handle 2
    HANDLE hGetEvent2 = NULL;
    if (hTest != NULL)
    {
        CloseHandle(hTest); //Close handle 1
        hTest = NULL;

        hGetEvent2 = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\Hello"); //Handle 2 exists, so we can get handle 3
    }


    HANDLE hGetEvent1 = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\Hello"); //Handle 1
    HANDLE hTest = CreateEvent(NULL, FALSE, FALSE, "Global\\Hello"); //Handle 2
    HANDLE hGetEvent2 = NULL;
    if (hTest != NULL)
    {
        CloseHandle(hTest); //Close handle 2
        hTest = NULL;

        hGetEvent2 = OpenEvent(EVENT_ALL_ACCESS, FALSE, "Global\\Hello"); //Handle 1  & Handle 2 are invalid, so we can not get handle 3
    }


总结:
1)如果CreateEvent成功,那么OpenEvent也是可以成功的,运行多次就可以获取多个handle;
2)如果CreateEvent成功后,有一个或则多个OpenEvent是成功的,那么即使关闭最原始的Event,再次呼叫OpenEvent也是可以成功的;




OpenEvent function


Opens an existing named event object.
Syntax
HANDLE WINAPI OpenEvent(
  _In_ DWORD   dwDesiredAccess,
  _In_ BOOL    bInheritHandle,
  _In_ LPCTSTR lpName
);


Parameters
dwDesiredAccess [in]
    The access to the event object. The function fails if the security descriptor of the specified object does not permit the requested access for the calling process. For a list of access rights, see Synchronization Object Security and Access Rights.

bInheritHandle [in]
    If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.

lpName [in]
    The name of the event to be opened. Name comparisons are case sensitive.
This function can open objects in a private namespace. For more information, see Object Namespaces.
    Terminal Services:  The name can have a "Global\" or "Local\" prefix to explicitly open an object in the global or session namespace. The remainder of the name can contain any character except the backslash character (\). For more information, see Kernel Object Namespaces.
    Note  Fast user switching is implemented using Terminal Services sessions. The first user to log on uses session 0, the next user to log on uses session 1, and so on. Kernel object names must follow the guidelines outlined for Terminal Services so that applications can support multiple users.

Return value
    If the function succeeds, the return value is a handle to the event object.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

Remarks
    The OpenEvent function enables multiple processes to open handles of the same event object. The function succeeds only if some process has already created the event by using the CreateEvent function. The calling process can use the returned handle in any function that requires a handle to an event object, subject to the limitations of the access specified in the dwDesiredAccess parameter.
The handle can be duplicated by using the DuplicateHandle function. Use the CloseHandle function to close the handle. The system closes the handle automatically when the process terminates. The event object is destroyed when its last handle has been closed.
分享到:
评论

相关推荐

    操作系统实验报告-并发与调度.DOC

    打开已有事件对象则使用OpenEvent() API。事件的状态可以通过SetEvent()、ResetEvent()和PulseEvent()来改变,影响等待该事件的线程的行为。 互斥体是另一种重要的同步机制,确保同一时刻只有一个线程能访问特定...

    实验二++Windows+xp进程的同步.pdf

    【Windows XP 进程同步】知识点详解 在Windows XP操作系统中,进程同步是多线程编程中的关键概念,确保多个线程能有效地共享资源并协调执行。本实验着重于理解和运用Windows XP中的线程同步机制,包括事件对象和...

    WinCE线程同步方法

    在设计和实现线程同步时,开发者需要注意以下几点: 1. 避免死锁:确保线程获取资源的顺序一致,防止循环等待。 2. 减少同步开销:尽量使用轻量级的同步机制,如临界区,而非重量级的互斥对象。 3. 使用适当的等待...

    秒杀windows多线程之事件

    除了创建事件,文档还提到了使用OpenEvent函数根据事件名称获取事件句柄,以及SetEvent和ResetEvent函数用于触发和重置事件状态。最后,文档强调了使用CloseHandle函数来清理和销毁事件对象,因为事件是内核对象。 ...

    操作系统实验报告3(2).doc

    例如,事件对象的使用可能涉及到一个父进程创建一个命名事件,子进程通过OpenEvent()打开并SetEvent()设置状态,以此通知父进程可以继续执行。而互斥体的应用则会展示如何在一个进程中保护共享资源,确保只有一个...

    (2)操作系统实验指导书20191

    创建互斥体使用CreateMutex,获取和释放使用WaitForSingleObject和ReleaseMutex。互斥体具有命名特性,可以跨进程同步。 实验"并发与调度"旨在让学生深入了解Windows Server 2003的线程同步机制。实验内容包括使用...

    深入浅出Win32多线程程序设计之线程通信[归类].pdf

    #### OpenEvent 用于打开一个已存在的事件对象。可以设置事件为signaled或nonsignaled状态,这对于线程同步非常关键。 #### CreateWaitableTimer 创建一个可等待的计时器对象。这种对象允许设置一个计时器,当时间...

    进程的同步与通信 流程图加源码

    - **步骤2**: 子进程使用`OpenEvent()`API打开事件对象。 - **步骤3**: 完成任务后,子进程使用`SetEvent()`API将事件设置为信号状态。 2. **互斥信号量示例** 使用互斥信号量来控制对共享资源的访问。当一个...

    线程查看的源代码

    避免不必要的系统调用,使用适当的数据结构存储和查找线程信息,以及合理地安排UI更新都是需要注意的方面。 8. **错误处理**:在实现过程中,必须对可能出现的错误进行妥善处理,如API调用失败、权限不足等问题,...

    C++ 不规则窗口

    这里通过`OpenEvent`尝试打开一个已经存在的事件对象,如果该事件不存在,则使用`CreateEvent`创建一个新的事件。这样做的目的是为了确保在整个程序运行期间只有一个实例在执行,即实现了单例模式。 ### 二、初始化...

    共享内存中传递handle

    因此,子进程可以通过`OpenProcess`和`OpenEvent`函数打开并使用这些继承的句柄,前提是这些句柄在创建子进程时被设置为可继承。在子进程中,可以使用`WaitForSingleObject`或`WaitForMultipleObjects`函数来等待`...

    Window下跨进程发消息(命名消息)

    注意,为了确保进程间的同步和正确性,我们需要处理一些异常情况,比如目标窗口未找到、命名对象无法打开等。此外,还要考虑线程安全问题,尤其是在多线程环境中。 总的来说,Windows下的跨进程通信是一个复杂但...

    实验二打印版1

    在清单2-1的程序中,`CreateEvent()`函数用于创建事件对象,而`OpenEvent()`用于打开已存在的事件。初始信号状态可以通过`CreateEvent()`的参数设定,通常默认为未设置(FALSE),表示事件尚未发生。当需要触发事件...

    open:一个处理打开事件的猫鼬事件处理程序

    猫鼬事件开放 一个处理打开事件的猫鼬事件处理程序目录安装npm install mongoose - events - open用法基本的var openEvent = require ( 'mongoose-events-open' )var dbdb = mongoose . connectiondb . on ( 'open' ...

    java版仿真记事本

    总的来说,Java版仿真记事本项目展示了Java在桌面应用程序开发中的应用,涵盖了文件I/O、GUI设计、事件处理、字符串操作等多个核心知识点。通过学习和分析这个项目,开发者可以深入理解Java编程的各个方面,并提升...

    Nginx常见错误及解决方法.doc

    Nginx 是一个流行的开源 Web 服务器软件,然而在实际使用中经常会遇到各种错误,影响服务器的稳定运行。下面将介绍 Nginx 中的一些常见错误及解决方法。 一、Nginx 启动错误 在安装 Nginx 时,可能会遇到启动错误...

    java记事本

    在Java记事本的实现中,主要涉及以下几个关键知识点: 1. **Swing或JavaFX**:这两个是Java提供的用于创建桌面应用的GUI库。Swing是早期的选择,提供了丰富的组件和自定义能力;而JavaFX则相对较新,具有更好的视觉...

    易语言禁止重运行

    总的来说,"易语言禁止重运行"是一个关于程序控制和多线程同步的重要知识点,它涉及到易语言对底层操作系统资源的管理和利用,对于理解和提升易语言编程能力具有重要意义。通过实践和学习此类代码,开发者不仅可以...

    线程间实现同步互斥的方法(合集)

    - `OpenEvent`:打开一个已经存在的事件对象。 - `SetEvent`:将事件设置为有信号状态。 - `PulseEvent`:将事件设置为有信号状态,并立即清除。 - `ResetEvent`:将事件设置为无信号状态。 **示例代码:** ```cpp...

Global site tag (gtag.js) - Google Analytics