我在理解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是否通过名称或其他东西识别它?
答案 0 :(得分:2)
此代码使用重叠I / O,这是一种异步函数,因此对WaitCommEvent()
的调用实际上并不等待串行事件发生,而是会发出给定事件对象的信号当有趣的事件发生时。
WaitForMultipleObjects
将等待两个给定事件对象中的任何一个发出信号:
WaitCommEvent()
检测到有趣的内容时,将设置第一个。