pja*_*all 2 c++ windows timeout device-driver readfile
我正在使用的设备驱动程序偶尔会错过来自硬件的中断。
要从设备读取数据,我使用该函数
BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
Run Code Online (Sandbox Code Playgroud)
当设备驱动程序错过中断时,此函数将永远阻塞。这会导致程序停止运行,必须重新启动 Windows 才能解决该问题。
为了解决这个问题,我想在调用 Readfile() 时使用超时限制。但是当我使用
BOOL WINAPI SetCommTimeouts(
__in HANDLE hFile,
__in LPCOMMTIMEOUTS lpCommTimeouts
);
Run Code Online (Sandbox Code Playgroud)
它失败并显示错误代码 87(无效参数)。显然,我不能在设备驱动程序句柄上使用这个超时的东西。我怎样才能解决这个问题?是否有其他方法可以在设备驱动程序上设置超时限制?
谢谢
您需要切换到异步 I/O。打开向CreateFile提供 FILE_FLAG_OVERLAPPED 标志的设备驱动程序,然后在调用 ReadFile时传递重叠结构。当 i/o 完成时,句柄将收到信号,因此您可以使用WaitForSingleObject,在其中提供传递给 ReadFile 的句柄和超时。
并非所有设备驱动程序都支持异步 I/O,因此这实际上可能不适合您。如果是这种情况,ReadFile仍然会阻塞并且不会返回“ERROR_PENDING_IO”。
如果超时,您还应该在重叠结构超出范围之前调用CancelIO来终止 ReadFile。否则,如果它碰巧稍后完成,它将尝试写入重叠结构所驻留的内存。
异步 I/O 的正确性有点棘手,因此请仔细阅读文档。
更新:我想到了另一种方法,您可以从看门狗线程调用CancelIEx 。作为一个较新的 API,它可能不会出现在您必须支持的平台上。