Figure 6: The monitoring thread function

UINT CPort::PortFunc(PVOID pv){
    CPort* pPort = (CPort*) pv;
    OVERLAPPED ol ;
    DWORD      dwMask, dwTransfer;

    memset(&ol,0,sizeof(OVERLAPPED));
    if ((ol.hEvent = CreateEvent(0,TRUE,FALSE,0)) == NULL){
        pPort->Err("CreateEvent");
        return 1;
    }

    while (pPort->_pData->_bGoOn){

        dwMask = 0 ;
        if (!WaitCommEvent(pPort->_pData->_hPort,&dwMask,&ol) &&
                ERROR_IO_PENDING == GetLastError()){
            GetOverlappedResult(pPort->_pData->_hPort, &ol,
                                &dwTransfer, TRUE);
            ol.Offset += dwTransfer ;
        };

        if ((dwMask & EV_RXCHAR) == EV_RXCHAR ){
            ResetEvent(pPort->_pData->_hEvNot);
            ((CWnd*)pPort->_pData->_pWnd)->
                PostMessage(WM_SERIAL_PORT, (WPARAM)pPort,
                            (LPARAM)EV_RXCHAR);
            WaitForSingleObject(pPort->_pData->_hEvNot,
                                INFINITE);
        };

    };
    
    CloseHandle(ol.hEvent);
    
    return 0;
};