никто не может пример привести скачивания файла в асинхронном режиме, плиз... проблема известная, при отправке запроса SendRequest при помощи функций WinInet иногда из за кривости серверов происходит зависание на несколько минут. проблему в принципе решил через ThreadTerminate , четко отслеживая момент в который это делается, но пишут в инете, что не освобождается так память и могут быть проблемы. потом советуют или использовать асинхронный режим или делать на сокетах. вот видимо так как примеров асинхронного режима найти не смог, то никто с ним не связывается, а сразу делают на сокетах. везде ограничиваются общими замечаниями часто противоречивыми.
bomz А после InternetOpen, нельзя ли выставить нужный таймаут? Как то вот так: Код (Text): InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,(PVOID)&dwTimeOut,dwSizeTimeOut); InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT,(PVOID)&dwTimeOut,dwSizeTimeOut); InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT,(PVOID)&dwTimeOut,dwSizeTimeOut); InternetSetOption(hSession,INTERNET_OPTION_SETTINGS_CHANGED ,NULL,NULL);
видимо нельзя раз асинхронный режим придумали. я его просто съэмулировал - асинхронный режим в синхронном режиме, может даже лучше получилось, потому что нифига не понял, как CallBack работать должен
Как это ты не нашёл примеров в интернете ? Я даже не знаю, какой запрос надо вбить в гугол, чтобы первой ссылкой не выдались чистые примеры ... http://www.codeproject.com/KB/IP/asyncwininet.aspx http://msdn.microsoft.com/en-us/library/cc185684%28v=vs.85%29.aspx Всё в рамках традиционной концепции асинхронности - передавай указатель на какую-нибудь свою описывающую запрос структуру как контекст, ставь заранее InternetSetStatusCallback(), не забывай про INTERNET_FLAG_ASYNC. Колбек будет вызываться WinINet-ом при разных ситуациях - когда, к примеру, результат функции, вернувшей IO_PENDING стал доступен - пришли данные (InternetQueryDataAvailable()), прочитаны данные (InternetReadFile/InternetReadFileEx IRF_ASYNC) и т.п. Для решения твоей задачи тебе просто надо будет отменить реквест по таймауту закрытием хендлов - InternetCloseHandle(). Тогда все данные освободяться и всё будет здорово и вечно, как у людей (с)
почитаем - оранжевое вроде что то толковое на первый взгляд. сомневаюсь что у микрософта проще получилось.
почему может быть утечка памяти - как уже упоминал асинхронный режим съэмулировал, путем создания кучи сигнальных флагов и ИД, то есть каждый тред заканчивается командой ThreadExit и ret еще на всякий случай после этого. но когда уже создалось и закончилось 150 потоков таким образом, прога скушала все таки - целый лишний 1 мб памяти.
Не обижайся, но ты идешь изначально в неправильном направлении, брось заниматься извращениями и сделай всё это по-человечески. У микрософта вполне нормальный пример, очевидный как луна и солнце. Ты видимо просто ещё не сталкивался с программированием какого-нибудь асинхронного механизма В таких случаях можно следить за выделяемой памятью - добавлять в блоки инфу о том, какая строка какого файла исходного кода вызвала оператор/функцию выделения, и т.д. и т.п.