0

我在理解 Klein 的 C++ 串行库中的示例时遇到了一些麻烦。在此页面的大约一半处,有一个名为“使用 Win32 同步对象”的部分,我无法理解。 http://www.codeproject.com/Articles/992/Serial-library-for-C

// Create a handle for the overlapped operations
HANDLE hevtOverlapped = ::CreateEvent(0,TRUE,FALSE,0);;

// Open the "STOP" handle
HANDLE hevtStop = ::CreateEvent(0,TRUE,FALSE,_T("Overlapped_Stop_Event"));

// Setup the overlapped structure
OVERLAPPED ov = {0};
ov.hEvent = hevtOverlapped;

// Wait for an event
serial.WaitEvent(&ov);

// Setup array of handles in which we are interested
HANDLE ahWait[2];
ahWait[0] = hevtOverlapped;
ahWait[1] = hevtStop;

// Wait until something happens
switch (::WaitForMultipleObjects(2,ahWait,FALSE,INFINITE))
{
case WAIT_OBJECT_0:
    // Serial port event occurred
    ...

case WAIT_OBJECT_0+1:
    // Stop event raised
    ...
}

这是 WaitEvent 从该调用中执行的内容(没有所有检查和内容):

// Wait for the COM event
::WaitCommEvent(m_hFile,LPDWORD(&m_eEvent),lpOverlapped);

::SetEvent(lpOverlapped->hEvent);

两个问题: 1) 为什么他同时使用串行类中的 WaitEvent 方法,然后立即使用 Windows API 中的 WaitForMultipleObjects?它们似乎都在做同样的事情:等待 COM 端口发生某些事情。2) Stop 事件如何发出信号?WaitForMultipleObjects 是否通过名称或其他方式识别它?

4

1 回答 1

2

此代码使用重叠 I/O,这是异步函数的一种形式,因此调用WaitCommEvent()实际上并不等待串行事件发生,而是在感兴趣的事件发生时向给定的事件对象发出信号。

WaitForMultipleObjects等待两个给定事件对象中的任何一个发出信号:

  1. WaitCommEvent()当检测到有趣的事情时,将设置第一个。
  2. 第二个,在这段代码中没有办法触发它,所以我猜测程序中会有另一部分会发出这个事件的信号,也许是名字,正如你所猜测的那样。
于 2015-03-08T20:17:13.547 回答