На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

Падение программы при обращении к матрице высот из другого потока

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1
RSS
Падение программы при обращении к матрице высот из другого потока
 
Добрый день!

Скажите пожалуйста, можно ли использовать из другого(не основного) потока методы работы с матрицей высот из mapapi с одновременной отрисовкой на карте?

Сейчас при загрузке матрицы высот, отображении ее на карте и обращении к ней для получения высоты по координатам в другом потоке на карте начинают появляться белые квадратики, а после программа падает при обновлении карты со следующим стеком:

0 rscGetObjBotValue(TMapRsc *, int) 0x7ffff5ddce99
1 TMapControl::CheckViewObject(FVSPR&, TMap&, TMapRsc&) 0x7ffff5e0f667
2 TMapControl::ShowList(TMap&, int, TMapSelect&, DFRAME *) 0x7ffff5e10952
3 TMapControl::ShowMap(TMap&, TMapSelect&, int) 0x7ffff5e10f27
4 TMapControl::ShowSituationPlace(int, int) 0x7ffff5f56a82
5 TMapControl::ShowData() 0x7ffff5d773e0
6 TMapPaint::PaintToDib(unsigned long, int, _RECT&, TObjectInfo *, int, int, TMapSelect *) 0x7ffff5db9d99
7 TMapPaint::Paint(unsigned long, int, _RECT&) 0x7ffff5dba5e0
8 TMapAccess::Paint95(unsigned long, int, _RECT&, int) 0x7ffff5d4df3c
9 mapPaint95Ex 0x7ffff5d95996
10 mapPaint95 0x7ffff5d959ab
11 TMapScreen::DrawMap(int, long, _RECT *, tagPOINT *, int) 0x7ffff5d97b3f
12 mapDrawImageMap 0x7ffff5d9976b
13 QDMapViewWindow::Repaint() 0x7ffff623029d

Код для работы с матрицей высот такой:

В основном потоке:
int number = mapOpenMtrForMap(this->m_mapView->GetMapHandle(), mtwFile, GENERIC_READ);
mapSetMtrView(m_mapView->GetMapHandle(), number, 0);
mapSetMtrView(m_mapView->GetMapHandle(), number, 3);

В рабочем потоке:
if(mapHeightValuePresence(m_mapView->GetMapHandle(), nullptr))
{
   double height = mapGetHeightValue(m_mapView->GetMapHandle(), planePoint.x(), planePoint.y());
}

В случае, же если матрица не отображается на экране mapSetMtrView(m_mapView->GetMapHandle(), number, 0), то все работает нормально.
 
Пожалуйста, укажите полное название программного обеспечения, которое используете.
 
Операционная система: Astra Linux SE 1.3 (smolensk)
ГИС конструктор: 11.03

Другую версию пока не можем использовать, но проверил и на последней, то же самое.
 
1.Для отрисовки в многопоточном режиме необходимо применять функцию:
Код
 // Отобразить фрагмент карты, смасштабировав до заданной ширины и высоты
 // в текущем составе объектов
 // hmap  - идентификатор открытых данных
 // imagedesc - описание выходного буфера изображения
 // erase - признак стирания фона перед выводом,
 // (0 - фон не стирать, !=0 - очистить фрагмент цветом фона,
 //  для экранного способа вывода (VT_SCREEN) всегда стирает
 //  цветом фона, кроме значения -2 (минус 2))
 // frame  - координаты фрагмента карты в системе координат документа в метрах
 // (см. mapSetDocProjection)
 // width  - ширина изображения в пикселах
 // height - высота изображения в пикселах
 // Описание структуры XIMAGEDESC в maptype.h
 // alpha - флаг использования альфа канала 0 - не использовать 1 - использовать
 // viewselect - условия отбора объектов, если равны 0, то применяются
 // условия обобщенного поиска\выделения
 // hPaint - идентификатор контекста отображения для многопоточного вызова функции отображения
 // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapPaintByFrameToXImagePro(HMAP hMap, XIMAGEDESC * imagedesc,  // 26/10/15
long int erase, DFRAME *frame, long int width, long int height, long int alpha, HSELECT viewselect, HPAINT hPaint); 

2.Для запроса высоты в многопоточном режиме необходимо применять следующие функции:
Код
  // Расчет абсолютной высоты методом треугольников в заданной точке
  // по матрице с наименьшим размером элемента (более точной).
  // Высота вычисляется по самой точной матрице высот,а в случае
  // необеспеченности заданной точки данными матриц высот -
  // по самой точной матрице слоев.
  // hMap   - идентификатор открытой основной векторной карты
  // Координаты точки (x,y) задаются в метрах в системе координат
  // векторной карты. Возвращает значение высоты в метрах.
  // hPaint - идентификатор контекста отображения для многопоточного вызова функций,
  //          создается функцией mapCreatePaintControl, освобождается - mapFreePaintControl
  // В случае ошибки при выборе высоты и в случае необеспеченности
  // заданной точки матричными данными возвращает ERRORHEIGHT
_MAPIMP double _MAPAPI mapGetPrecisionHeightTriangleEx(HMAP hMap,double x, double y, HPAINT hPaint); 

 // Вычисление значения массива элементов с применением метода треугольников     // 15/04/16
 // по матрицам высот (применяется для обработки OGC WCS-запросов)
 // hmap   - идентификатор документа, содержащего открытые матрицы высот (MTW)
 // matrix - указатель на буфер выходной матрицы 4-ех байтовых целочисленных элементов
 // width  - ширина выходной матрицы (число элементов в строке)
 // hight  - высота выходной матрицы (число строк)
 // unit   - единица измерения высоты в матрице (0 - метры, 1 - дециметры, 2 - сантиметры, 3 - миллиметры)
 // dframe - габариты матрицы на местности в системе координат матрицы (и документа)
 //          от юго-западного элемента матрицы до северо-восточного
 // minvalue - поле для записи минимального значения элемента в выходной матрице
 // maxvalue - поле для записи максимального значения элемента в выходной матрице
 // hpaint - контекст поддержки многопоточного вызова (см. mapCreatePaintControl)
 // В случае необеспеченности заданной точки матричными данными в элемент записывается ERRORHEIGHT (-111111)
 // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetPrecisionHeightFrame(HMAP hmap, int * matrix, long int width, long int hight,
long int unit, DFRAME * dframe, long int * minvalue, long int * maxvalue, HPAINT hpaint); 
 
Т.е. использовать компонент QDMapView нельзя в таком случае?
 
На данный момент отрисовка в компонентах реализована на других функциях. Данный вопрос для компонент прорабатывается.
 
В основном потоке приложения можно применять любые функции отображения из QDMapView.
Чтобы запрос высоты не влиял на основной поток нужно применять многопоточные функции запроса высоты, приведенные выше.

Код
// Тут выделяются буферы для размещения данных потока
HPAINT hPaint = mapCreatePaintControl(m_mapView->GetMapHandle());
...

// Многократный запрос высоты в отдельном потоке
mapGetPrecisionHeightTriangleEx(m_mapView->GetMapHandle(), planePoint.x(), planePoint.y(), hPaint);
...

// Освободить буферы потока, когда они стали не нужны
mapFreePaintControl(hPaint);
 
Спасибо большое, теперь все ясно!
Страницы: 1
Читают тему (гостей: 2)



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