我有一个被识别为 HID 外围设备的 USB 设备。我使用
ReadFile
和 WriteFile
Win32 API 函数与它进行通信。
设备有时会“卡住”并且没有响应,需要拔掉插头并重新插入。这本身并不是一个问题,但它会导致对
WriteFile
的调用阻塞,直到设备被拔掉,而这 是一个问题。
我读过可以使用重叠 I/O 来防止这种情况,但它不起作用。对
WriteFileEx
的呼叫仍然阻塞!
代码片段:
HANDLE hFCreateFileW(devicePath, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
OVERLAPPED overlapped = {0};
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!WriteFileEx(hFile, buffer, length, &overlapped, nullptr))
return FALSE;
for (int elapsed = 0; !HasOverlappedIoCompleted(&overlapped); elapsed++) {
std::this_thread::sleep_for(1ms);
if (elapsed > READ_TIMEOUT_MS)
return FALSE;
}
如何强制写入超时而不是永远阻塞?
(注意:该解决方案需要适用于从 XP 开始的所有 Windows 版本。)
根据CreateFileW文档,需要在
FILE_FLAG_OVERLAPPED
参数中设置dwFlagsAndAttributes
才能启用文件的非阻塞操作。
所以你应该打开文件为
HANDLE hFile = CreateFileW(devicePath, NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
否则,即使传递了
OVERLAPPED
,对文件的操作仍会被序列化。