WinInet асинхронный режим

Тема в разделе "WASM.BEGINNERS", создана пользователем bomz, 3 май 2011.

  1. bomz

    bomz New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    26
    никто не может пример привести скачивания файла в асинхронном режиме, плиз...

    проблема известная, при отправке запроса SendRequest при помощи функций WinInet иногда из за кривости серверов происходит зависание на несколько минут. проблему в принципе решил через ThreadTerminate , четко отслеживая момент в который это делается, но пишут в инете, что не освобождается так память и могут быть проблемы. потом советуют или использовать асинхронный режим или делать на сокетах. вот видимо так как примеров асинхронного режима найти не смог, то никто с ним не связывается, а сразу делают на сокетах. везде ограничиваются общими замечаниями часто противоречивыми.
     
  2. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    bomz
    А после InternetOpen, нельзя ли выставить нужный таймаут?
    Как то вот так:
    Код (Text):
    1. InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,(PVOID)&dwTimeOut,dwSizeTimeOut);
    2. InternetSetOption(hSession,INTERNET_OPTION_SEND_TIMEOUT,(PVOID)&dwTimeOut,dwSizeTimeOut);
    3. InternetSetOption(hSession,INTERNET_OPTION_RECEIVE_TIMEOUT,(PVOID)&dwTimeOut,dwSizeTimeOut);
    4. InternetSetOption(hSession,INTERNET_OPTION_SETTINGS_CHANGED ,NULL,NULL);
     
  3. bomz

    bomz New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    26
    видимо нельзя раз асинхронный режим придумали. я его просто съэмулировал - асинхронный режим в синхронном режиме, может даже лучше получилось, потому что нифига не понял, как CallBack работать должен
     
  4. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Как это ты не нашёл примеров в интернете ? Я даже не знаю, какой запрос надо вбить в гугол, чтобы первой ссылкой не выдались чистые примеры ...

    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(). Тогда все данные освободяться и всё будет здорово и вечно, как у людей (с)
     
  5. bomz

    bomz New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    26
    почитаем - оранжевое вроде что то толковое на первый взгляд. сомневаюсь что у микрософта проще получилось.
     
  6. bomz

    bomz New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    26
    почему может быть утечка памяти - как уже упоминал асинхронный режим съэмулировал, путем создания кучи сигнальных флагов и ИД, то есть каждый тред заканчивается командой ThreadExit и ret еще на всякий случай после этого. но когда уже создалось и закончилось 150 потоков таким образом, прога скушала все таки - целый лишний 1 мб памяти.

     
  7. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Не обижайся, но ты идешь изначально в неправильном направлении, брось заниматься извращениями и сделай всё это по-человечески. У микрософта вполне нормальный пример, очевидный как луна и солнце. Ты видимо просто ещё не сталкивался с программированием какого-нибудь асинхронного механизма

    В таких случаях можно следить за выделяемой памятью - добавлять в блоки инфу о том, какая строка какого файла исходного кода вызвала оператор/функцию выделения, и т.д. и т.п.
     
  8. bomz

    bomz New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    26
    да мне что обижаться, когда я давно дошел. а память попупы жрали - не разрушал окна