На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Артефакты при рисовании карт из разных потоков

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 3 4 След.
RSS
Артефакты при рисовании карт из разных потоков
 
Приветствую!

ГИС Конструктор для Qt Designer x64 (версия 11.8.3), ОС Astra Linux

Стокнулся с очередной проблемой при рисовании карты открытой с WMTS. (Хотя, возможно с типом карты это и не связано)
Учитывая коментарии про потоконебезопасность и принцип работы серверных приложений, которые рисуют в нескольких потоках (с разными HMAP) решил открыть несколько экземпляров одной и той же карты и рисовать их параллельно.
В результате получаю картинки недорисованные, смазанные, и с прочими дефектами, как только два и более потоков начинают рисовать.

Во время отрисовки никаких действий кроме отрисовки с HMAP не производится.

Что пробовал:
При открытии карт указывал различные директории для работы и временных файлов;
Использовал метод mapPaintToXImage;
Использовал метод mapPaintByFrameToXImage.

Возникает ощущение, что при отрисовке, где-то внутри используется один и тот же буфер отрисовки изображения и два потока его успешно портят.

Вопрос:
Что делаю не так?

ЗЫ:
И все же до сих пор непонятно, для чего создавать еще какие-то буферы для отрисовки если в аргументах (XIMAGEDESC) я сам передаю указатель на кусок памяти достаточного размера.

С уважением,
Матвеев П.В.
 
Работать с геопорталами нельзя в нескольких потоках, даже с разными HMAP. Библиотека wmsacces.so потоконебезопасна, так как использует глобальный буфер отрисовки.
Изменено: Владимир Железняков - 02.07.2015 09:17:15
 
Приветствую!

А что делать если это необходимость?
И как же тогда работают серверные приложения, которые рисуют в нескольких потоках (с разными HMAP)?

С уважением,
Матвеев П.В.
 
Вы можете рисовать в многопоточном режиме с разными hmap любые векторные, растровые, матричные данные. Но подключать геопорталы надо в одном потоке. Вы можете открыть несколько геопорталов для одного HMAP одновременно.
Изменено: Владимир Железняков - 02.07.2015 16:23:10
 
Приветствую!

Решил проверить многопоточную отрисовку на локальной карте (sitx) mapPaintByFrameToXImage()
Условия как прежде:
4 потока, 4 разных HMAP

Картинки вроде как нормальные, но временами подписи портятся:



С уважением,
Матвеев П.В.
 
Произвели адаптацию отображения подписей для многопоточного режима. Скачать ГИС конструктор можно по ссылке: http://gisinfo.ru/download_linux?id=56
 
Проявилась точно такая же проблема при отрисовке карты Подольска в несколько потоков: 4 потока, 4 разных HMAP.
Проблема проявляется в виде испорченных подписей, все остальные объекты отрисовываются нормально.
Пробовал mapPaintByFrameToXImage и mapPaintByFrameToXImagePro с собственными объектами HPAINT для каждого потока - результат одинаковый.
Код
// Версия библиотеки MapAccess
// (если применяется "mapacces.h" и т.п.)
#define MAPACCESSVERSION  20160418

// Версия интерфейса MAPAPI и ядра библиотеки
#define MAPAPIVERSION  0x0111302
 
Артефактов с подписями не возникает, если я использую 1 HMAP на 4 разных потока, но иногда изображение карты пропадает ненадолго. Однако, из того, что я нашёл на форуме, такой способ не является верным в любом случае.
На данный момент рисую карту следующим образом:
Код
static bool paintToXIMage(HMAP hmap, char* pixels, int cx, int cy, int width, int height, int stride) {
    XIMAGEDESC ximagedesc;
    ximagedesc.Depth     = mapdepth;
    ximagedesc.CellSize  = mapdepth / 8;
    ximagedesc.Point     = pixels; 
    ximagedesc.Width     = width;
    ximagedesc.Height    = height;
    ximagedesc.RowSize   = stride;

    DFRAME frame;
    frame.X1 = cx, frame.Y1 = cy, frame.X2 = cx + width, frame.Y2 = cy + height;
    mapPictureToPlane(hmap, &frame.X1, &frame.Y1);
    mapPictureToPlane(hmap, &frame.X2, &frame.Y2);
    /*HPAINT hPaint = mapCreatePaintControl(hmap);
    long ret = mapPaintByFrameToXImagePro(hmap, &ximagedesc, 0, &frame, width, height, 0, 0, hPaint);
    mapFreePaintControl(hPaint);
    return ret;*/
    return mapPaintByFrameToXImage(hmap, &ximagedesc, &frame, width, height, 0);
}
Данная функция выполняется в каждом потоке. Изображение разделено на 4 равные части по высоте. Таким образом, cx всегда 0, width всегда одно и то же, height всегда четверть всей высоты изображения, cy - (номер_потока * height). Полное изображение карты в итоге склеивается правильно.
Где я ошибаюсь?
 
Действительно, открывать данные для каждого потока излишне.
Алгоритм представляется так:
1. Открыть данные
2. Создать для каждого потока HPAINT
3. В каждом потоке выполнять рисование при помощи mapPaintByFrameToXImagePro
4. После завершения всех потоков закрыть созданные HPAINT

Создание HPAINT при каждом рисовании - накладно, как и открытие карты для каждого потока.
 
Владимир, так я тоже пробовал (закомментированный участок кода в моём предыдущем сообщении) - надписи всё равно выводятся с артефактами.
Страницы: 1 2 3 4 След.
Читают тему (гостей: 3)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности