Асинхронный вызов функции WaitCommEvent
От: dmkSar  
Дата: 22.05.07 18:20
Оценка:
Программа отслеживает события COM порта. Функция WaitCommEvent вызывается асинхронно, затем функция WaitForSingleObject бесконечно долго ожидает наступления события. Подскажите способы завершения ожидания событий, и какой результат при этом вернет WaitForSingleObject? Спасибо.



unsigned int PortReadThread(void *)
{    // Флаг ожидания выполнения асинхронной операции
    bool        fWaitOnStat = FALSE;    

    // Реагируем на любое событие COM порта
    
// Создаем объект события
    osStatus.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    while (hPort != INVALID_HANDLE_VALUE)
    {
        if (!fWaitOnStat)
        {
            if (!WaitCommEvent(hPort, &dwCommEvent, &osStatus)) 
            {
                if (GetLastError() == ERROR_IO_PENDING)
                {    // Запущено ожидание события COM порта
                    fWaitOnStat = TRUE;
                }
                else
                {    // Ошибка функции WaitCommEvent
                }
            }
            else
            {    // WaitCommEvent вернула управление сразу
            }
        }
        else
        {    // Ожидаем событие 
            dwRes = WaitForSingleObject(osStatus.hEvent, INFINITE);
            fWaitOnStat = FALSE;    // Произошло событие COM порта
            switch(dwRes)
            {
                 case WAIT_TIMEOUT:
                        // Эта ветка не должна получить управление
                        break;
                 case WAIT_FAILED:
                        // WaitForSingleObject завершилась неудачно
                        break;
                 case WAIT_OBJECT_0:
                    if (!GetOverlappedResult(hPort, &osStatus, &dwOvRes, FALSE))
                        {
                          // GetOverlappedResult завершилась неудачно
                        }

                    // Анализируем событие
                        }
                }
         }
…    
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.