ГИС Конструктор для Qt Designer x64 (версия 11.8.3), ОС Astra Linux
Стокнулся с очередной проблемой при рисовании карты открытой с WMTS. (Хотя, возможно с типом карты это и не связано) Учитывая коментарии про потоконебезопасность и принцип работы серверных приложений, которые рисуют в нескольких потоках (с разными HMAP) решил открыть несколько экземпляров одной и той же карты и рисовать их параллельно. В результате получаю картинки недорисованные, смазанные, и с прочими дефектами, как только два и более потоков начинают рисовать.
Во время отрисовки никаких действий кроме отрисовки с HMAP не производится.
Что пробовал: При открытии карт указывал различные директории для работы и временных файлов; Использовал метод mapPaintToXImage; Использовал метод mapPaintByFrameToXImage.
Возникает ощущение, что при отрисовке, где-то внутри используется один и тот же буфер отрисовки изображения и два потока его успешно портят.
Вопрос: Что делаю не так?
ЗЫ: И все же до сих пор непонятно, для чего создавать еще какие-то буферы для отрисовки если в аргументах (XIMAGEDESC) я сам передаю указатель на кусок памяти достаточного размера.
Работать с геопорталами нельзя в нескольких потоках, даже с разными HMAP. Библиотека wmsacces.so потоконебезопасна, так как использует глобальный буфер отрисовки.
Вы можете рисовать в многопоточном режиме с разными hmap любые векторные, растровые, матричные данные. Но подключать геопорталы надо в одном потоке. Вы можете открыть несколько геопорталов для одного HMAP одновременно.
Проявилась точно такая же проблема при отрисовке карты Подольска в несколько потоков: 4 потока, 4 разных HMAP. Проблема проявляется в виде испорченных подписей, все остальные объекты отрисовываются нормально. Пробовал mapPaintByFrameToXImage и mapPaintByFrameToXImagePro с собственными объектами HPAINT для каждого потока - результат одинаковый.
Код
// Версия библиотеки MapAccess
// (если применяется "mapacces.h" и т.п.)
#define MAPACCESSVERSION 20160418
// Версия интерфейса MAPAPI и ядра библиотеки
#define MAPAPIVERSION 0x0111302
Артефактов с подписями не возникает, если я использую 1 HMAP на 4 разных потока, но иногда изображение карты пропадает ненадолго. Однако, из того, что я нашёл на форуме, такой способ не является верным в любом случае. На данный момент рисую карту следующим образом:
Данная функция выполняется в каждом потоке. Изображение разделено на 4 равные части по высоте. Таким образом, cx всегда 0, width всегда одно и то же, height всегда четверть всей высоты изображения, cy - (номер_потока * height). Полное изображение карты в итоге склеивается правильно. Где я ошибаюсь?
Действительно, открывать данные для каждого потока излишне. Алгоритм представляется так: 1. Открыть данные 2. Создать для каждого потока HPAINT 3. В каждом потоке выполнять рисование при помощи mapPaintByFrameToXImagePro 4. После завершения всех потоков закрыть созданные HPAINT
Создание HPAINT при каждом рисовании - накладно, как и открытие карты для каждого потока.