C++串口库对Win32同步函数的使用?
C++ serial library's use of Win32 synchronization functions?
我在理解克莱因的 C++ 串行库中的示例时遇到了一些问题。在这个页面的一半左右,有一个名为 "Use of Win32 synchronization objects" 的部分,我无法理解它。
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 从该调用执行的内容(w/o 所有检查和内容):
// Wait for the COM event
::WaitCommEvent(m_hFile,LPDWORD(&m_eEvent),lpOverlapped);
::SetEvent(lpOverlapped->hEvent);
两个问题:
1) 为什么他同时使用序列 class 中的 WaitEvent 方法,然后紧接着使用 Windows API 中的 WaitForMultipleObjects 方法?它们似乎都在做同样的事情:等待 COM 端口发生某些事情。
2) Stop 事件是如何发出信号的? WaitForMultipleObjects 是否通过名称或其他方式识别它?
此代码使用重叠 I/O,这是一种异步函数形式,因此对 WaitCommEvent()
的调用实际上并不等待串行事件发生,而是会发出信号当有趣的事件发生时给定事件对象。
WaitForMultipleObjects
将等待两个给定事件对象中的任何一个被通知:
- 当
WaitCommEvent()
检测到一些有趣的东西时,将设置第一个。
- 第二个,在这段代码中没有办法触发它,所以我猜程序中会有另一部分会发出这个事件的信号,也许是你猜的那样。
我在理解克莱因的 C++ 串行库中的示例时遇到了一些问题。在这个页面的一半左右,有一个名为 "Use of Win32 synchronization objects" 的部分,我无法理解它。 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 从该调用执行的内容(w/o 所有检查和内容):
// Wait for the COM event
::WaitCommEvent(m_hFile,LPDWORD(&m_eEvent),lpOverlapped);
::SetEvent(lpOverlapped->hEvent);
两个问题: 1) 为什么他同时使用序列 class 中的 WaitEvent 方法,然后紧接着使用 Windows API 中的 WaitForMultipleObjects 方法?它们似乎都在做同样的事情:等待 COM 端口发生某些事情。 2) Stop 事件是如何发出信号的? WaitForMultipleObjects 是否通过名称或其他方式识别它?
此代码使用重叠 I/O,这是一种异步函数形式,因此对 WaitCommEvent()
的调用实际上并不等待串行事件发生,而是会发出信号当有趣的事件发生时给定事件对象。
WaitForMultipleObjects
将等待两个给定事件对象中的任何一个被通知:
- 当
WaitCommEvent()
检测到一些有趣的东西时,将设置第一个。 - 第二个,在这段代码中没有办法触发它,所以我猜程序中会有另一部分会发出这个事件的信号,也许是你猜的那样。