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

Виктор Минаев (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Виктор Минаев
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Qt Location Plugin
 
Уважаемые разработчики Панорамы,
не планируется ли вами в ближайшее время разработка плагина для Qt Location?
Deadlock при вызове mapGetHeightValueOfMtr
 
Здравствуйте!

ГИС Конструктор для Qt Designer x64 (версия 11.10.5, Qt 4.8, ОС AstraLinux, Смоленск, релизы 1.4, 1.5)

В программе:
В 1-м потоке загружается карта и матрица высот.
Затем запускается 2-й поток, в котором вызывается функция mapGetHeightValueOfMtr. После выполнения работы поток завершается.
После этого запускается 3-й поток, в котором вызываются функции mapGeoToPlane, mapGetHeightValueOfMtr. Поток блокируется на мьютексе:[CODE]#0 0x00007fffeff34d5c in __lll_lock_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00007fffeff303c4 in _L_lock_997 () from /lib/x86_64-linux-gnu/libpthread.so.0
#2 0x00007fffeff30227 in pthread_mutex_lock () from /lib/x86_64-linux-gnu/libpthread.so.0
#3 0x00007fffd9c9a85b in EnterTheCriticalSection(pthread_mutex_t*) () from /usr/lib/libqdmapacces.so
#4 0x00007fffd9dccd74 in TRmf::LockPoint() () from /usr/lib/libqdmapacces.so
#5 0x00007fffd9e088ff in TRmf::GetPoint(int&, int, int, TPaintControl*) () from /usr/lib/libqdmapacces.so
#6 0x00007fffd9e08ac3 in TRmf::GetPoint(double&, int, int, TPaintControl*) () from /usr/lib/libqdmapacces.so
#7 0x00007fffd9e090db in TRmf::GetPlanePoint(double&, double, double, TPaintControl*) () from /usr/lib/libqdmapacces.so
#8 0x00007fffd9d46f35 in RMFCHAIN::GetRmfElementHeightChain(double, double, double*, TPaintControl*) () from /usr/lib/libqdmapacces.so
#9 0x00007fffd9db6d54 in TMapControl::GetHeightValue(int, double, double, TPaintControl*) () from /usr/lib/libqdmapacces.so
#10 0x00007fffd9dbbec2 in mapGetHeightValueOfMtr () from /usr/lib/libqdmapacces.so [/CODE]Судя по стеку, при получении высоты с матрицы высот используется контекст отображения. Возможно, в библиотеке есть какие-то ошибки с освобождением его блокировок.

Попробовал заменить mapGetHeightValueOfMtr на mapGetHeightValueOfMtrControl.
Работает.
Но для использования mapGetPrecisionHeightValueEx мне приходится создавать контекст отображения, который согласно документации занимает около 10 МБ. А, учитывая, что я использую два экрана с разрешением 1920x1200, возможно и больше. При этом я использую mapapi только для получения данных с карты и ничего при помощи него не рисую. Мне кажется, было бы логично использовать для функций не связанных с отображением не контекст отображения, а другой механизм блокировок.

 Кроме того, я в каждый момент времени работаю с картой только в одном потоке. Карта не изменяется. Мне не нужны блокировки. Захват мьютекса - операция недорогая, но я вызываю mapGetHeightValueOfMtr сотни тысяч – миллионы раз. Хотелось бы иметь механизм отключения блокировок и/или использования одной блокировки на серию операций с картой.
 
С уважением,
Минаев В.Б.
Страницы: 1



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

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