其中 发生ERROR_IO_PENDING错误 如何不阻塞 继续接收
时间: 2023-09-07 17:11:58 浏览: 470
gtornado 使tornado支持调用阻塞IO时不阻塞
当使用异步I/O操作时,可能会遇到ERROR_IO_PENDING错误。这个错误表示操作已经启动,但是还没有完成。如果你想在不阻塞的情况下继续接收,你需要使用异步回调函数来处理这个错误。
在异步回调函数中,你需要检查操作的结果。如果操作成功完成,你可以处理接收到的数据。如果操作没有完成,你可以继续等待,或者尝试发起新的操作。
以下是一个示例代码,展示了如何处理ERROR_IO_PENDING错误并继续接收:
```
DWORD bytesRead = 0;
OVERLAPPED overlapped = { 0 };
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!ReadFile(hFile, buffer, bufferSize, &bytesRead, &overlapped)) {
DWORD lastError = GetLastError();
if (lastError != ERROR_IO_PENDING) {
// 处理错误
return;
}
}
// 等待操作完成
DWORD result = WaitForSingleObject(overlapped.hEvent, INFINITE);
if (result == WAIT_OBJECT_0) {
// 操作完成
GetOverlappedResult(hFile, &overlapped, &bytesRead, FALSE);
// 处理接收到的数据
} else {
// 等待超时或错误
return;
}
```
在这个示例代码中,我们使用ReadFile函数来读取数据,如果返回ERROR_IO_PENDING错误,就表示操作已经启动。我们创建了一个OVERLAPPED结构体,并使用CreateEvent函数来创建一个事件对象。然后,我们等待操作完成,如果操作完成,我们可以使用GetOverlappedResult函数来获取结果,并处理接收到的数据。如果等待超时或错误,我们就退出函数。
阅读全文