我使用的是偶尔会错过硬件中断的设备驱动程序。
要从设备读取数据,我使用该function
BOOL WINAPI ReadFile( __in HANDLE hFile, __out LPVOID lpBuffer, __in DWORD nNumberOfBytesToRead, __out_opt LPDWORD lpNumberOfBytesRead, __inout_opt LPOVERLAPPED lpOverlapped );
当设备驱动程序错过一个中断时,该function永远阻塞。 这导致程序停滞,并且必须重新启动窗口来解决它。
要解决这个问题,我想调用Readfile()时使用超时限制。 但是当我使用
BOOL WINAPI SetCommTimeouts( __in HANDLE hFile, __in LPCOMMTIMEOUTS lpCommTimeouts );
它会失败,错误代码87(无效的参数)。 显然,我不能在设备驱动程序句柄上使用这个超时的东西。 我怎样才能解决这个问题? 有没有其他方法来设置设备驱动程序的超时限制?
谢谢
您需要切换到异步I / O。 打开提供FILE_FLAG_OVERLAPPED标志给CreateFile的设备驱动程序,然后在调用ReadFile时传递重叠结构。 当I / O完成时,句柄将被发送信号,所以你可以使用WaitForSingleObject来传递给ReadFile的句柄和一个超时。
并非所有设备驱动程序都支持异步I / O,所以这可能不适合您。 如果是这种情况, ReadFile将仍然阻塞,不返回“ERROR_PENDING_IO”。
如果超时,则应在重叠结构超出范围之前调用CancelIO来终止 ReadFile。 否则,如果碰巧晚些时候完成,它会尝试将内存写入用于存储的重叠结构。
异步I / O有点棘手,所以仔细阅读文档。
更新:我发现一个替代方案可以从看门狗线程中调用CancelIEx 。 作为一个更新的API,它可能不会出现在你必须支持的平台上。