createEventA 函数 (synchapi.h)

创建或打开命名或未命名的事件对象。

若要为对象指定访问掩码,请使用 CreateEventEx 函数。

语法

HANDLE CreateEventA(
  [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,
  [in]           BOOL                  bManualReset,
  [in]           BOOL                  bInitialState,
  [in, optional] LPCSTR                lpName
);

参数

[in, optional] lpEventAttributes

指向 SECURITY_ATTRIBUTES 结构的指针。 如果此参数为 NULL,则子进程无法继承句柄。

结构的 lpSecurityDescriptor 成员为新事件指定 安全描述符 。 如果 lpEventAttributesNULL,则该事件将获取默认的安全描述符。 事件的默认安全描述符中的 ACL 来自创建者的主要或模拟令牌。

[in] bManualReset

如果此参数为 TRUE,该函数将创建一个手动重置事件对象,该对象需要使用 ResetEvent 函数将事件状态设置为非对齐状态。 如果此参数为 FALSE,该函数将创建自动重置事件对象,系统会在释放单个等待线程后自动将事件状态重置为非对齐状态。

[in] bInitialState

如果此参数为 TRUE,则会发出事件对象的初始状态;否则,它未对齐。

[in, optional] lpName

事件对象的名称。 名称限制为 MAX_PATH 个字符。 名称比较区分大小写。

如果 lpName 与现有命名事件对象的名称匹配,此函数将请求 EVENT_ALL_ACCESS 访问权限。 在这种情况下, bManualResetbInitialState 参数将被忽略,因为它们已被创建过程设置。 如果 lpEventAttributes 参数不为 NULL,则确定是否可以继承句柄,但忽略其安全描述符成员。

如果 lpNameNULL,则创建事件对象时没有名称。

如果 lpName 与同一命名空间中另一种对象的名称匹配, (例如现有的信号灯、互斥体、可等待计时器、作业或文件映射对象) ,则函数将失败, GetLastError 函数返回 ERROR_INVALID_HANDLE。 发生这种情况是因为这些对象共享相同的命名空间。

该名称可以具有“全局”或“本地”前缀,以在全局或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符 (\) 以外的任何字符。 有关详细信息,请参阅 内核对象命名空间。 使用终端服务会话实现快速用户切换。 内核对象名称必须遵循终端服务概述的准则,以便应用程序可以支持多个用户。

可以在专用命名空间中创建对象。 有关详细信息,请参阅 对象命名空间

返回值

如果函数成功,则返回值是事件对象的句柄。 如果在函数调用之前存在命名事件对象,该函数将返回现有对象的句柄, GetLastError 返回 ERROR_ALREADY_EXISTS

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

注解

CreateEvent 返回的句柄具有EVENT_ALL_ACCESS访问权限;它可用于需要事件对象的句柄的任何函数,前提是调用方已获得访问权限。 如果事件是从服务或模拟其他用户的线程创建的,则可以在创建事件时向事件应用安全描述符,或者通过更改其默认 DACL 来更改创建过程的默认安全描述符。 有关详细信息,请参阅 Synchronization Object Security and Access Rights

调用过程的任何线程都可以在调用某个 等待函数时指定事件对象句柄。 当发出指定对象的状态时,单对象等待函数将返回。 当发出任何对象或发出所有指定对象的信号时,可以指示多对象等待函数返回。 等待函数返回时,将释放等待线程以继续执行。

事件对象的初始状态由 bInitialState 参数指定。 使用 SetEvent 函数将事件对象的状态设置为信号。 使用 ResetEvent 函数将事件对象的状态重置为非对齐状态。

当手动重置事件对象的状态发出信号时,它将保持信号,直到它被 ResetEvent 函数显式重置为非对齐状态。 在发出对象状态信号时,可以释放任意数量的等待线程或随后开始指定事件对象的等待操作的线程。

当自动重置事件对象的状态发出信号时,它会保持信号,直到释放单个等待线程:然后,系统会自动将状态重置为非对齐状态。 如果没有线程在等待,则事件对象的状态将保持已发信号状态。

多个进程可以包含同一事件对象的句柄,从而允许使用该对象进行进程间同步。 以下对象共享机制可用:

  • 如果 CreateEventAttributes 参数启用了 CreateEvent 继承的 lpEventAttributes 参数,则 CreateProcess 函数创建的子进程可以继承事件对象的句柄。
  • 进程可以在调用 DuplicateHandle 函数时指定事件对象句柄,以创建另一个进程可以使用的重复句柄。
  • 进程可以在调用 OpenEventCreateEvent 函数时指定事件对象的名称。
使用 CloseHandle 函数关闭句柄。 系统在进程终止时自动关闭句柄。 事件对象在关闭其最后一个句柄时被销毁。

示例

有关使用 CreateEvent 的示例,请参阅 使用事件对象

注意

synchapi.h 标头将 CreateEvent 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非中性编码别名与非非编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅 函数原型的约定

要求

   
最低受支持的客户端 Windows XP [桌面应用|UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用|UWP 应用]
目标平台 Windows
标头 synchapi.h (包括 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CloseHandle

CreateEventEx

CreateProcess

DuplicateHandle

事件对象

对象名称

OpenEvent

ResetEvent

SECURITY_ATTRIBUTES

SetEvent

同步函数