Я пишу программу, которая, помимо прочего, должна загружать файл с учетом его URL. Мне лень внедрять протоколы Http / Https вручную, поэтому мне нужна была библиотека / объект / функция, которая будет выполнять эту работу.
Критическое требование : загрузка должна быть асинхронной. То есть поток, который произвел загрузку, должен иметь возможность делать что-то еще «во время» загрузки файла, плюс загрузка должна быть в состоянии прервать в любое время без каких-либо варварских побочных эффектов (таких как внутренний вызов TerminateThread
).
Хорошие требования:
- Должен быть в состоянии загрузить файл "в память". Средства - читать содержимое файла по мере его поступления, не обязательно сохранять его в каком-либо файле "файловой системы".
- Было бы неплохо иметь некоторый удобный механизм уведомления о прогрессе Win32 (ожидаемое событие, семапор, порт завершения и т. Д.), А не просто периодически запрашивать состояние загрузки.
Я выбрал XmlHttpRequest
COM-объект для выполнения работы. Казалось, что он работает достаточно хорошо, плюс он поддерживает асинхронный режим.
Однако я заметил, что через некоторое время он просто перестает работать.
То есть после нескольких успешных загрузок файлов он перестает что-либо загружать.
Я периодически опрашиваю его, чтобы получить его статус, он сообщает "в процессе", но на самом деле ничего не происходит, и нет сетевой активности. Более того, когда тот же процесс создает другой экземпляр объекта XmlHttpRequest
для выполнения новых загрузок - эффект тот же. Объект сообщает «в процессе», в то время как он даже не пытается подключиться к серверу (согласно снифферам сети и состоянию TCP системы).
Единственный способ вернуть этот объект обратно - это перезапустить процесс. Это заставляет меня подозревать, что в объекте есть какая-то ошибка (извините, я имел в виду недокументированная функция ). Также это не ошибка на уровне отдельного объекта, так как проблема сохраняется, когда объект уничтожается и создается другой. Вероятно, это некоторое глобальное состояние библиотеки DLL, которая реализует этот объект.
Кто-нибудь знает что-нибудь об этом? Это известная ошибка?
Я почти уверен, что в моем коде нет другой ошибки, из-за которой, как мне кажется, ошибка в XmlHttpRequest
. Я провел достаточное количество тестов и провел время с отладчиком, чтобы без всяких сомнений сделать вывод, что просто объект перестает работать.
Кстати, пока объект должен работать, я делаю все ожидания с помощью MsgWaitXXXX
вызовов API. Так что, если этот объект нуждается в работе цикла сообщений (например, он может создать скрытое окно уведомлений и привязать его к сокету через WSAAsyncSelect
) - я даю ему такую возможность.