Hello,
my HID device sends IN report every 200 msec. I call THid::Execute every 10 msec. However, I lose 20% of IN reports. Input buffer count is 512.
When I increase timeout value for WaitForSingleObject I lose less reports. But I want the WaitForSingleObject function to work with zero timeout.
void THid::Execute(void)
{
THidReportExt ReportExt;
HANDLE Event;
OVERLAPPED Overlapped;
DWORD ReadBytes;
if(!Handle) {
return;
}
Event = CreateEvent(NULL, TRUE, FALSE, NULL);
Overlapped.hEvent = Event;
Overlapped.Offset = 0;
Overlapped.OffsetHigh = 0;
while(true) {
if(!ReadFile(Handle, &ReportExt, Capabilities.InputReportByteLength, &ReadBytes, &Overlapped)) {
if(GetLastError() != ERROR_IO_PENDING) {
return;
}
DWORD Result = WaitForSingleObject(Event, 0);
if(Result == WAIT_TIMEOUT || Result == WAIT_ABANDONED) {
CancelIo(Handle);
return;
}
if(Result != WAIT_OBJECT_0) {
return;
}
if(!GetOverlappedResult(Handle, &Overlapped, &ReadBytes, FALSE)) {
return;
}
}
if(ReadBytes != (DWORD)Capabilities.InputReportByteLength) {
return;
}
}
}
This is how I open the file:
Handle = CreateFile(Path,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);