C++;串行库';Win32同步功能的使用? 我理解了克莱因的C++系列库的一个例子。大约在本页的一半,有一个部分叫做“Win32同步对象的使用”,我在后面遇到了一些问题。

C++;串行库';Win32同步功能的使用? 我理解了克莱因的C++系列库的一个例子。大约在本页的一半,有一个部分叫做“Win32同步对象的使用”,我在后面遇到了一些问题。 ,c++,winapi,serial-communication,overlapped-io,C++,Winapi,Serial Communication,Overlapped Io,下面是WaitEvent从该调用执行的内容(不包含所有检查和内容): 两个问题: 1) 为什么他同时使用serial类中的WaitEvent方法和Windows API中的WaitForMultipleObject?它们似乎都在做相同的事情:等待COM端口发生某些事情。 2) 如何发出停止事件的信号?WaitForMultipleObjects是否通过名称或其他方式识别它?此代码使用重叠I/O,这是异步函数的一种形式,因此对WaitCommEvent()的调用实际上并不等待串行事件发生,而是在感

下面是WaitEvent从该调用执行的内容(不包含所有检查和内容):

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

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

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

  • WaitCommEvent()
    检测到有趣的内容时,将设置第一个
  • 第二个,在这段代码中没有办法触发它,所以我猜程序中会有另一个部分发出这个事件的信号,可能是名字,就像你猜的那样
  • // 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
        ...
    }
    
    // Wait for the COM event
    ::WaitCommEvent(m_hFile,LPDWORD(&m_eEvent),lpOverlapped);
    
    ::SetEvent(lpOverlapped->hEvent);