2014-11-18 4 views
0

Я хочу, чтобы ReadFile() с последовательным устройством связи возвращался, когда принимался хотя бы один байт или когда был тайм-аут.ReadFile Timeout для времени задержки между байтами

Как я искал о тайм-ауте для ReadFile().

Большинство людей упоминают SetCommTimeouts() и overlapped I/O

Но SetCommTimeouts() не возвращается, байт не будет принят, хотя, пока время ожидания.

И overlapped I/O(GetOverlappedResult) также не удовлетворяет моим требованиям. правильно?

И все же я знаю GetOverlappedResultEx(), похоже, поддерживает это, используя параметр DWORD dwMilliseconds, я не хочу использовать функции EX.

Есть ли способ?

+0

«Я не хочу использовать функции серии EX».: Почему? Многие базовые API Win32 заканчиваются на 'Ex'. – Richard

+0

вы можете использовать функцию «select» с таймаутом, после чего она возвращается, когда доступен символ или время ожидания. он возвращает значение, указывающее, что произошло. – user3629249

+0

Но, как известно в окнах, выберите только для сокета. Нет? – SangminKim

ответ

0

Вы должны использовать асинхронную версию функции, указав FILE_FLAG_OVERLAPPED.

Когда тайм-аут достигнут, вы можете позвонить CancelIo с помощью дескриптора файла.

HANDLE hThread = CreateThread(NULL, 0, TizReadFile, tizHandle, 0, 0); 
WaitForSingleObject(hThread, 2); 
CancelIo(tizHandle); 
... 
DWORD WINAPI TizReadFile(HANDLE &tizHandle) 
{ 
    DWORD dwRead = 0; 
    if(0 == ReadFile(tizHandle, g_globalBuffer, dwWant2Read, &dwRead, 0)) 
     return GetLastError(); 
    return 1; 
} 
Смежные вопросы