Добрый день!
В контексте многопоточного использования функций получения высоты можно выделить два момента:
- предполагается, что данные функции атомарны и будут выполняться до конца;
- для запуска в отдельном потоке предназначены функции с собственным контекстом отображения HPAINT (более подробно описано в п. 3.9.9 "Многопоточное отображение карт" [URL=https://gistoolkit.com/download/doc/gisdesigner_prog.pdf]Руководства программиста ГИС Конструктор[/URL]).
Применительно к Вашей можно порекомендовать следующие подходы:
- использовать функции получения высота с параметром HPAINT - например, mapGetPrecisionHeightTriangle() (mtrapi.h). Примеры использования данной функции можно посмотреть в тестовых примерах из состава инсталляции ГИС Конструктор.[CODE] // Расчет абсолютной высоты методом треугольников в заданной точке // по матрице с наименьшим размером элемента (более точной).
// В матрицах обрабатываются нормальные высоты
// Высота вычисляется по самой точной матрице высот,а в случае
// необеспеченности заданной точки данными матриц высот -
// по самой точной матрице слоев.
// hMap - идентификатор открытой основной векторной карты
// Координаты точки (x,y) задаются в метрах в системе координат
// векторной карты. Возвращает значение высоты в метрах.
// hPaint - идентификатор контекста отображения для многопоточного вызова функций,
// создается функцией mapCreatePaintControl, освобождается - mapFreePaintControl
// В случае ошибки при выборе высоты и в случае необеспеченности
// заданной точки матричными данными возвращает ERRORHEIGHT (-111111)
_MAPIMP double _MAPAPI mapGetPrecisionHeightTriangle(HMAP hMap, double x, double y);
_MAPIMP double _MAPAPI mapGetPrecisionHeightTriangleEx(HMAP hMap,double x, double y, HPAINT hPaint);[/CODE]- вместо использования функции mapGetGeneralHeight() можно считать участок матрицы в память с помощью функции mapGetMtrFrame() (mtrapi.h) и произвести необходимые расчеты. При этом необходимо сделать чтение участка матрицы потокобезопасным. О функциях работы с матричными картами можно посмотреть в п. 3.9.25 "Работа с матричной электронной картой" [URL=https://gistoolkit.com/download/doc/gisdesigner_prog.pdf]Руководства программиста ГИС Конструктор[/URL].[CODE] // Чтение прямоугольного участка матрицы в заданную область памяти
// hMap - идентификатор открытых данных
// number - номер матрицы в списке открытых матриц
// bits - указатель на начало области памяти
// left - смещение участка матрицы слева (в элементах)
// top - смещение участка матрицы сверху (в элементах)
// width - ширина участка матрицы (в элементах)
// height - высота участка матрицы (в элементах)
// widthinbyte - ширинa участка матрицы в байтах
// Размер участка, заданного адресом bits, должен быть не менее
// (width * height * размер элемента матрицы в байтах),
// в противном случае возможны ошибки работы с памятью.
// Запрос размера элемента матрицы в байтах - функция mapGetMtrElementSize.
// Высоты участка записываются в область bits в единицах измерения
// значений высот данной матрицы.
// Запрос единицы измерения значений высот матрицы - функция mapGetMtrMeasure.
// При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetMtrFrame(HMAP hMap, long int number, char *bits,
long int left, long int top,
long int width, long int height,
long int widthinbyte = 0);[/CODE]
В любом случае описанные подходы отталкиваются от того, что функции получения высоты атомарны и подразумевают, что будут выполнены до конца.
Если Вы предоставите дополнительную информацию о решаемой Вами задаче, мы сможем порекомендовать более подходящее решение.