SASGIS

Веб-картография и навигация

Многопотоковая закачка в SAS

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Многопотоковая закачка в SAS

Сообщение zed » 23 янв 2009, 18:02

Хотелось бы, наконец, увидеть многопоточность в SAS. По личным наблюдениям многопоточность увеличивает скорость загрузки тайлов в 1,5-2 раза.
В аттаче модуль реализующий эту самую поточность. Причём, количество потоков по-умолчанию не ограничено. Для подключения к SAS нужно вызывать всего одну функцию из этого модуля (функция GET)! Так же поддерживается и работа через прокси, путём определения значений соответствующим переменным в модуле.
Пример вызова функции:
Код: Выделить всё
fPath:='c:\Downloads\Test\test.png';
url:='http://t1.maps.gurtam.by/map_gmaps?n=404&x=1050&y=688&zoom=6';
GET(url,fPath);

Для ограничения потоков, перед вызовом функции GET можно выполнять код ожидания (без замирания приложения):
Код: Выделить всё
while DownloadThread.DLCourants>=5 do
Application.ProcessMessages;

(ограничение в 5 потоков)

P.S. Для работы модуля необходим компонент INDY (но он в SAS и так, по-моему, используется)
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Многопотоковая закачка в SAS

Сообщение vdemidov » 23 янв 2009, 18:55

Боюсь так просто с этим не разобраться. Просто для некоторых типов контента требудется дополнительная обработка, а использование вашего модуля этого сделать не позволит.
И настоятельно рекомендую вам использовать критические секции или, хотя бы, InterlockedIncrement и InterlockedDecrement для изменения счетчика потоков. Иначе можно получить глюки - представляете, что будет, если два потока одновременно закончат выполнение и начнут менять DLCourants одновременно?
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 136 раз.

Re: Многопотоковая закачка в SAS

Сообщение svp » 23 янв 2009, 20:09

А никто не думал о том, чтобы сделать менеджер закачек отдельно?
Отдельное приложение которое:
  • Поддерживает формат пакетов карт Планеты. Берёт оттуда скрипты формирования URL, антибан-настройки, пути к локальному кешу, базу URL тайлов.
  • Имеет отдельную иконку в систем-трее.
  • Принимает заявки на закачку (для начала) через параметры командной строки в виде, например, цепочки координат полигона в формате Base64, либо в виде ссылки на файл выделения.
  • Не даёт запускать себя дважды. При запуске второй копии прога ищет уже запущенную себя и передаёт в ту копию свои параметры запуска, после чего закрывается.
  • Имеет основное окошко с гридом как у DownloadMaster'а, например с отдельными строками для каждой загрузки.
  • Выдаёт уведомления при банах, показывает капчу, ждёт и отсылает ответ пользователя.
  • Постоянно следит за наличием интернета и временно ставится на паузу при его отсутствии.

В Планете уже предлагалось сделать настраиваемые вкладки запуска внешних утилит
Механизм должен позволять:
  • Добавлять любое количество таких настраиваемы вкладок (вкладки прописываются в спец. разделе ини-файла настроек).
  • На вкладке должен быть множественный селектор масштабов, множественный селектор карт и слоёв, лейбл с названием действия.
  • В настройках для вкладки прописывается скрипт формирования командной строки.
Это позволит разгрузить код Планеты и немного освободить разработчика от вопросов, которые могут решаться единомышленниками.
Аватара пользователя
svp
Советчик
 
Сообщения: 447
ICQ: 204094886
Зарегистрирован: 26 авг 2008, 11:14
Откуда: Белгород
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.

Re: Многопотоковая закачка в SAS

Сообщение zed » 23 янв 2009, 20:14

vdemidov писал(а):Просто для некоторых типов контента требудется дополнительная обработка, а использование вашего модуля этого сделать не позволит.

Какая имеется в виду "обработка"?
Модуль не претендует на статус завершенного решения. Если у вас есть мысли по доработке - вносите свои изменения в модуль - это только приветствуется.
А на счёт InterlockedIncrement и InterlockedDecrement спасибо, учтём.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Многопотоковая закачка в SAS

Сообщение vdemidov » 23 янв 2009, 23:00

Ну насколько я разобрался в коде, сейчас kmz распаковываются перед записью, плюс может выполняться конвертация png - jpg
А вносить свои изменения я буду :)
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 136 раз.

Re: Многопотоковая закачка в SAS

Сообщение zed » 23 янв 2009, 23:17

Т.е. нужно, чтоб файл после загрузки сохранялся не на диск, а в поток (TMemoryStream)? Хм, как-то наверное можно и это сделать... вопрос только как :)
Кривовато, но можно так: после вызова функции GET начинать проверку наличия файла на диске (FileExists) и как только файл появится - загрузить его в мемористрим и делать что там нужно...
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Многопотоковая закачка в SAS

Сообщение vdemidov » 23 янв 2009, 23:27

Вот я и говорю, что криво получается. Нужно делать базовый класс, который умеет качать тайл, обработать его и сохранить. А потом в наследниках менять способы обработки и сохранения. И это все встраивать в Планету.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 136 раз.

Re: Многопотоковая закачка в SAS

Сообщение svp » 24 янв 2009, 13:31

vdemidov писал(а):И это все встраивать в Планету.

Можно не в саму Планету, а в dll-плагин.
Аватара пользователя
svp
Советчик
 
Сообщения: 447
ICQ: 204094886
Зарегистрирован: 26 авг 2008, 11:14
Откуда: Белгород
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.

Re: Многопотоковая закачка в SAS

Сообщение zed » 24 янв 2009, 13:59

svp писал(а):
vdemidov писал(а):И это все встраивать в Планету.

Можно не в саму Планету, а в dll-плагин.

Ну, во-первых, в SAS нет поддержки плагинов, а во-вторых, в данном случае речь именно о встраивании. Просмотр и закачка карт - базовая функция SAS, и надо бы эту функцию сделать максимально эффективной. Если при закачке некоего региона ещё можно запустить несколько паралельных закачек и искуственно создать многопоточность, то во время "сёрфа" (просмотра и подгрузки карт в режиме Интернет+кэш) приходится мириться с медленной однопоточной работой.
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

Re: Многопотоковая закачка в SAS

Сообщение svp » 24 янв 2009, 14:55

zed писал(а):Ну, во-первых, в SAS нет поддержки плагинов

Ну так а кто-то сомневается, что такая поддержка появится?

zed писал(а):Просмотр и закачка карт - базовая функция SAS, и надо бы эту функцию сделать максимально эффективной.

Когда речь идёт об эффективной отрисовке и борьбе за FPS на слабых компах, то да. Встраивать нужно. Но закачка всегда ограничивается скоростью интернета, и какой бы ни была эта скорость, никакие плагины или даже скрипты медленнее чем интернет работать не будут. Ну или надо, по крайней мере, очень постараться и сделать всё ну вообще из рук вон через одно место плохо.

zed писал(а):Если при закачке некоего региона ещё можно запустить несколько паралельных закачек и искуственно создать многопоточность, то во время "сёрфа" (просмотра и подгрузки карт в режиме Интернет+кэш) приходится мириться с медленной однопоточной работой.

Везде нужна многопоточность. Даже при подгрузке тайлов из кеша. Потому, что сейчас, пока не вытянуты тайлы из кеша, события мыши не воспринимаются. При медленном отклике кеша (например если он в сети лежит, да ещё и по wifi) вообще неприятно работать.

Поучение тайлового контента надо формализовать и абстрагировать таким образом, чтобы взятие тайла из кеша не отличалось по смыслу от взятия тайла из интернета или, положим, с ftp. Нужно выделить абстрактную сущность "Источник_Кеша". Все конкретные источники кеша должны быть его наследниками. Несколько активных экземпляров конкретных источников кеша выстраиваются в порядке приоритета, например: локальный кеш, ftp, интернет
Так как каждый из этих источников является наследником абстрактного класса, то и сделать их конкретные реализации можно в разных вариантах:
  • С доступом к кешу СасПланеты новго типа (в файловой системе).
  • С доступом к кешу в беркли.
  • С доступом к кешу в mysql.
  • С доступом к кешу на локальном http-сервере.
  • С доступом к кешу в форматах посторонних прог.
  • ftp кеш.
И все эти варианты можно в любом произвольном порядке с конкретными своими настройками выстроить в порядке желаемого приоритета для каждой конкретной карты.
Сама реализация конкретного класса "Источника_Кеша" может лежать в dll. То есть, по сути, dll должна экспортировать функцию создания экземпляра "Источника_Кеша". И с этим экземпляром планета уже будет общаться кск со стандартным источником.

Так вот, процесс изъятия тайлов из пула источников должен быть в отдельном потоке. По мере получения тайлов из источника они должны лепиться на скрытый буффер слоя, который при каждой перерисовке окна копируется в контекст экрана.
Внимание! Точно таким же способом будет формироваться карта построения!
Просто будет специфический "Источник", который либо по индексу, либо по наличию файла, либо по другим признакам, формирует полупрозрачные тайлы слоя заполнения. И эти тайлы, совершенно не заставляя пользователя ждать, пояаляются на экране в параллельном потоке наравне со всеми остальными тайлами карт и слоёв.
Аватара пользователя
svp
Советчик
 
Сообщения: 447
ICQ: 204094886
Зарегистрирован: 26 авг 2008, 11:14
Откуда: Белгород
Благодарил (а): 2 раз.
Поблагодарили: 4 раз.

След.

Вернуться в SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 6