Я использую InternetSetStatusCallback для потоковой передачи данных:
CallbackPointer = InternetSetStatusCallback(SessionHandle,
(INTERNET_STATUS_CALLBACK)CallBack);
Иногда нижеуказанная функция CallBack вызывается снова перед выходом, несмотря на то, что потоковые данные отправляются каждые 250 мс, поэтому у программы должно быть достаточно времени дляобработать данные.
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 вызывается дважды и получает сообщения об ошибках, одно для ожидающего ввода-вывода и одно для внутренней ошибки InternetReadFileEx.Следующий раунд снова хорош, а потом ошибки.
Я сделал трюк «bool insideFunc», чтобы увидеть, происходит ли то, что я подозреваю, и да, иногда «вызов» является правдой перед установкой, поэтому иногда это так.называется до того, как это закончится.Я только хочу прочитать мое сообщение на INTERNET_STATUS_RESPONSE_RECEIVED, но иногда CallBack () вызывается снова до его завершения, и InternetReadFileEx происходит с неправильной синхронизацией, в результате чего он возвращает коды ошибок 997 и 12004.
Как это исправить?