流媒体错误:在退出上一个呼叫之前,请再次调用InternetStatusCallback
Streaming error: InternetSetStatusCallback is called again before the previous call exited
我正在使用internettatuscallback进行流数据:
CallbackPointer = InternetSetStatusCallback(SessionHandle,
(INTERNET_STATUS_CALLBACK)CallBack);
有时,尽管每250ms发送流式数据,但以下回调函数在退出之前再次调用,因此该程序应该有足够的时间处理数据。
bool InsideFunc = false;
VOID CALLBACK
CallBack(
__in HINTERNET hInternet,
__in DWORD_PTR dwContext,
__in DWORD dwInternetStatus,
__in_bcount(dwStatusInformationLength) LPVOID lpvStatusInformation,
__in DWORD dwStatusInformationLength
)
{
if (InsideFunc)
{
// should not happen
}
InsideFunc = true;
cOandaFeed* oandaFeed = (cOandaFeed*)dwContext;
ASSERTRETURN(oandaFeed);
ASSERT(dwContext);
switch (dwInternetStatus) {
case INTERNET_STATUS_HANDLE_CREATED:
oandaFeed->StatusHandle = lpvStatusInformation;
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
if (oandaFeed->State == cOandaFeed::OPENING)
oandaFeed->StartFeeding();
break;
case INTERNET_STATUS_RESPONSE_RECEIVED:
if (oandaFeed->State == cOandaFeed::FEEDING) {
oandaFeed->ReadFile(); // this is where I call InternetReadFileEx
oandaFeed->CollectAndForwardChunks();
}
break;
case INTERNET_STATUS_HANDLE_CLOSING:
oandaFeed->SetState(cOandaFeed::IDLE);
break;
case INTERNET_STATUS_RECEIVING_RESPONSE:
break;
}
InsideFunc = false;
}
因此,程序正确初始化并获得Internet_status_receiving_response和Internet_status_response_received状态响应等。到目前为止,一切都很好。但是下一个迭代出错了,InternetReadFileex两次打电话给错误消息,一个用于待处理的IO,另一个用于InternetReadFileex的内部错误。下一轮再次很好,然后是错误。
我做了" bool insidefunc"的技巧,以查看我怀疑发生的事情,是的,有时"呼叫"在设置之前是正确的,因此有时甚至在结束之前被调用。我只想在Internet_status_response_received上读取我的消息,但有时在完成之前再次打电话()再次调用,而InternetReadFileex发生了不良时机,从而导致它返回错误代码997和12004。
。我该如何解决?
我能够轻松修复此问题。问题在于,我将readfile()呼叫保留在交换机中的Internet_status_response_received情况下。它引起了麻烦,因为该状态是通过回调在我的readfile()内的InternetReadFileex()的呼叫中发送的,从
因此,第一个readfile()调用导致997:error_io_pending,而第二个调用(导致递归)导致12004:内部错误。
解决方案:我将readfile()移到交换机中的Internet_status_request_complete案例之后,我只会得到error_io_pending,因为我们在readfile()中都没有得到回调,地位。在InternetReadFileex()返回之后很久之后,我们获得了这种状态。error_io_pending是正常的:
请注意,getlastror代码error_io_pending不是故障。它指定读取操作正在异步完成。
引用https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi/nf-fileapi-readfile
流媒体作品
- 致电InternetReadFileex()
- 它返回io待定
- 当它具有新数据(价格)时,它只是通过Internet_status_request_complete将其发送异步。
- 如果它没有任何数据(没有价格更改)几秒钟,它只会通过Internet_status_request_complete发送心跳以避免超时。
- 我在收到数据(请参阅#1) 之后,立即再次致电InternetReadFileex()
这是Oanda的流媒体运作方式,但我想这是常见的做法?
谢谢大家的答复。
- 没有找到相关文章