流媒体错误:在退出上一个呼叫之前,请再次调用InternetStatusCallback

Streaming error: InternetSetStatusCallback is called again before the previous call exited

本文关键字:InternetStatusCallback 调用 错误 退出 呼叫 上一个 流媒体      更新时间:2023-10-16

我正在使用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

流媒体作品

  1. 致电InternetReadFileex()
  2. 它返回io待定
  3. 当它具有新数据(价格)时,它只是通过Internet_status_request_complete将其发送异步。
  4. 如果它没有任何数据(没有价格更改)几秒钟,它只会通过Internet_status_request_complete发送心跳以避免超时。
  5. 我在收到数据(请参阅#1)
  6. 之后,立即再次致电InternetReadFileex()

这是Oanda的流媒体运作方式,但我想这是常见的做法?

谢谢大家的答复。

相关文章:
  • 没有找到相关文章