使用CreateEvent创建/打开已存在的事件会重置信号吗?

问题描述 投票:0回答:2

如果我使用

CreateEvent
打开活动:

 responseWaitEvent = CreateEvent(NULL,        // no security
  TRUE,       // manual-reset event
  FALSE,      // not signaled
  (LPTSTR)eventName); // event name

并且此事件已经存在并已发出信号。此调用是否会重置信号(因为将初始状态设置为 FALSE)?

或者调用时会立即退出等待吗:

 if (responseWaitEvent)
 {
  DWORD dw = WaitForSingleObjectEx(responseWaitEvent, m_ResponseTimeoutMillis, FALSE);
c++ multithreading events visual-c++ winapi
2个回答
4
投票

第二次调用将打开事件,它不会改变事件的状态。

我知道这一点,因为文档说它会打开它,但不会重置它。如果它重置了它,那么这一点就很重要了。

HANDLE responseWaitEvent = CreateEvent(NULL,        // no security
    TRUE,       // manual-reset event
    TRUE,      // signaled
    (LPTSTR)_T("TESTEvent")); // event name
    assert(responseWaitEvent && "Could not create event");

responseWaitEvent = CreateEvent(NULL,        // no security
    TRUE,       // manual-reset event
    FALSE,      // not signaled
    (LPTSTR)_T("TESTEvent")); // event name

    assert(responseWaitEvent && "Could not open event");

DWORD dw = WaitForSingleObjectEx(responseWaitEvent, 10000, FALSE);
assert(dw != WAIT_TIMEOUT);

相反:

HANDLE responseWaitEvent2 = CreateEvent(NULL,        // no security
    TRUE,       // manual-reset event
    FALSE,      // not signaled
    (LPTSTR)_T("TESTEvent2")); // event name
    assert(responseWaitEvent && "Could not create event");

responseWaitEvent2 = CreateEvent(NULL,        // no security
    TRUE,       // manual-reset event
    TRUE,      // signaled
    (LPTSTR)_T("TESTEvent2")); // event name
    assert(responseWaitEvent && "Could not open event");

DWORD dw2 = WaitForSingleObjectEx(responseWaitEvent2, 10000, FALSE);
assert(dw2 == WAIT_TIMEOUT);

0
投票

使用现有事件的名称调用 CreateEvent 将打开具有该名称的现有事件,但根本不会重置它,即它不会更改其状态。

也没有 CreateEvent 重置已经存在的事件的逻辑。

ResetEvent 应该执行此操作,而不是 CreateEvent。

© www.soinside.com 2019 - 2024. All rights reserved.