Я хочу, чтобы ReadFile()
с устройством последовательной связи возвращался, когда был получен хотя бы один байт или время ожидания.
Поскольку я искал тайм-аут для ReadFile()
.
Большинство людей упоминают SetCommTimeouts()
и overlapped I/O
Но SetCommTimeouts()
не возвращается, байт получен, хотя и до таймаута.
И overlapped I/O(GetOverlappedResult)
также не удовлетворяет моим требованиям. правильно?
И тем не менее я знаю, что GetOverlappedResultEx()
похоже, поддерживает это, используя DWORD dwMilliseconds
, я не хочу использовать функции серии EX
.
Там в любом случае?
Вы должны использовать асинхронную версию функции, указав 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;
}
Ex
.