USB-HID Read/Write(重叠)WaitForSingleObject 不 return C++
USB-HID Read/Write (Overlapped) WaitForSingleObject does not return C++
我正在尝试通过 USB HID 与设备通信。在某些时候我想使用 winapi 从设备读取数据。我首先创建文件
HidDeviceObject = CreateFile (
(LPCTSTR)DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, //&SecurityAttributes,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
这部分好像已经测试过了。然后我在初始化我的应用程序时创建了一个线程。线程看起来像这样
int result;
BOOL fWaitingOnRead = FALSE;
while(TRUE)
{
if(!write)
{
if (HidDeviceObject != INVALID_HANDLE_VALUE)
{
HIDOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
result = ReadFile(HidDeviceObject, &InputReport, Capabilities.InputReportByteLength, &NumberOfBytesRead, &HIDOverlapped);
if (GetLastError() != ERROR_IO_PENDING)
// Error
else
fWaitingOnRead = TRUE;
if(fWaitingOnRead)
DWORD dwRes = WaitForSingleObject(HIDOverlapped.hEvent, INFINITE);
}
}
}
在知道有来自我的其他 USB 设备的周期性数据的情况下执行此代码。但问题是 WaitForSingleObject 没有 return。当然,通过将值设置为例如 500ms 而不是 INFINITE 会得到一个超时代码。那么这种行为的原因是什么。谢谢
您正在寻找 GetOverlappedResult
而不是 WaitForSingleObject
。不要挑出事件,使用整个 OVERLAPPED
对象。
GetOverlappedResultEx
接受超时值,如果您再次需要 500 毫秒。
我正在尝试通过 USB HID 与设备通信。在某些时候我想使用 winapi 从设备读取数据。我首先创建文件
HidDeviceObject = CreateFile (
(LPCTSTR)DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, //&SecurityAttributes,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
这部分好像已经测试过了。然后我在初始化我的应用程序时创建了一个线程。线程看起来像这样
int result;
BOOL fWaitingOnRead = FALSE;
while(TRUE)
{
if(!write)
{
if (HidDeviceObject != INVALID_HANDLE_VALUE)
{
HIDOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
result = ReadFile(HidDeviceObject, &InputReport, Capabilities.InputReportByteLength, &NumberOfBytesRead, &HIDOverlapped);
if (GetLastError() != ERROR_IO_PENDING)
// Error
else
fWaitingOnRead = TRUE;
if(fWaitingOnRead)
DWORD dwRes = WaitForSingleObject(HIDOverlapped.hEvent, INFINITE);
}
}
}
在知道有来自我的其他 USB 设备的周期性数据的情况下执行此代码。但问题是 WaitForSingleObject 没有 return。当然,通过将值设置为例如 500ms 而不是 INFINITE 会得到一个超时代码。那么这种行为的原因是什么。谢谢
您正在寻找 GetOverlappedResult
而不是 WaitForSingleObject
。不要挑出事件,使用整个 OVERLAPPED
对象。
GetOverlappedResultEx
接受超时值,如果您再次需要 500 毫秒。