C++ 丢失事件信号?
我正试图通过USB向外部设备发送消息并从中接收消息 它与HidD_GetInputReport()和HidD_SetOutputReport()配合使用效果良好。问题是,当我发送命令时,我会有一些临时延迟,因为我正在与之交谈的设备需要一些时间来响应和填充应答缓冲区。我们想摆脱这种拖延 我研究了使用ReadFile()和WriteFile()API的选项 我写了一个这样的文件:C++ 丢失事件信号?,c++,winapi,usb,hid,C++,Winapi,Usb,Hid,我正试图通过USB向外部设备发送消息并从中接收消息 它与HidD_GetInputReport()和HidD_SetOutputReport()配合使用效果良好。问题是,当我发送命令时,我会有一些临时延迟,因为我正在与之交谈的设备需要一些时间来响应和填充应答缓冲区。我们想摆脱这种拖延 我研究了使用ReadFile()和WriteFile()API的选项 我写了一个这样的文件: DWORD bytesRead; OVERLAPPED osWrite = { 0 }; osWrite.h
DWORD bytesRead;
OVERLAPPED osWrite = { 0 };
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
bool success = WriteFile(Device, packetBuffer, packetLength, &bytesRead, &osWrite);
if ( false == success )
{
WaitForSingleObject(osWrite.hEvent, INFINITE);
if (!GetOverlappedResult(Device, &osWrite, &bytesRead, TRUE))
{
printf("write failed \n");
GetErrorMessage();
}
else
{
printf("write passed \n");
}
success = TRUE;
}
CloseHandle(osWrite.hEvent);
WriteFile工作正常。与我通话的设备接收我的信息,然后作出响应
然后我执行ReadFile()以获取该信息。以下是用于此目的的代码片段:
DWORD bytesRead;
OVERLAPPED osReader = { 0 };
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
bool success = ReadFile(Device, packetBuffer, packetLength, &bytesRead, &osReader);
if ( success == false)
{
if (!GetOverlappedResult(m_hDevice, &osReader, &bytesRead, TRUE))
{
GetErrorMessage();
}
}
我们也收到了回复。因此,它工作得很好,但有时(对于某些特定的命令),如果设备需要一段时间来响应,主机端似乎一直在等待信号,并且从不继续。我已经确认设备最终会有响应(比如10秒后),但主机似乎从未收到信号。我使用匿名事件来确保它不会被任何其他进程吃掉
所以,我们只是停留在if(!GetOverlappedResult(m_hDevice,&osReader,&bytesRead,TRUE))
是否有人能提供任何关于我遗漏了什么的信息,或者是否有不正确的地方
FWIW,这就是我创建设备的方式
Device = CreateFile( Path,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
你的代码无论如何都是错误的。您不检查结果或I/O。调用
GetOverlappedResult
仅在I/O返回的ERROR\u IO\u PENDING
情况下才有意义。还有,为什么您打开文件时使用file\u FLAG\u OVERLAPPED
,但实际上使用同步I/O?@RbMm我知道重叠和同步I/O并不能很好地结合在一起,因为它违背了重叠的I/O。这只是目前的一个要求,不会对正常操作造成任何问题。我确实检查了readfile响应,但它不包括在这里,并且它是错误IO挂起的。除此之外,您是否看到任何问题会导致它没有收到信号?我确实检查了readfile响应,但它不包括在这里-为什么在这种情况下不发布实际代码?波斯特的具体代码是错误的。如果读或写返回false-您需要在开始调用时调用GetLastError()
。对于您在读取(无意义)后仍称之为WaitForSingleObject
,而在写入后不执行此操作。再一次-或者使用真正的异步I/O-在I/O后不要等待到位,或者删除重叠的文件\u标志。我认为这不是次要的细节。为什么GetOverlappedResult
是无限等待?在具体代码中-如果ReadFile
失败,但没有出现错误\u IO_PENDING
-osReader.hEvent,则不会设置为result,如果请求未完成或同步失败(i/o返回false,但最后一个错误未处于挂起状态),则不会设置GetOverlappedResult
无限等待hEvent
。根据你的代码和信息-不可能给出另一个答案。他们确实响应了我们最初的要求——这一点是绝对不清楚的