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

ГИС Оператор, прикладные задачи и потоки

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

Сделал простой плагин к ГИС Оператору в котором пытаюсь создать новый поток. В этом случае ГИС Оператор с загруженным плагином падает.
Поток пробовал создавать разными способами: std::thread или QThread или даже создавать QTcpServer — результат идентичный.
Вопрос: что я делаю не так?
Код
#include "movingmapobject.h"

#include <iostream>
#include <thread>

#include <mapapi.h>

extern "C"
{
long int WINAPI GetInterfaceVersion()
{
    return MAPACCESSVERSION;
}
}  // extern "C"

extern "C"
{
//Если назвать функцию CallGisFunctionEx как указано в документации, то Оператор ругается: Функции "CallMapFunctionEx, CallMapFunction, CreateMapTask" или "CreatePanTask"не найдены !
long int WINAPI CallMapFunctionEx(HMAP hmap, TASKPARMEX * parm)
{
    std::cerr << "CallMapFunctionEx()" << std::endl;

    MovingMapObject* mmo = new MovingMapObject; //MovingMapObject Пустой класс. Только пустые конструктор, деструктор и функция doWork() {}

    std::thread* thr = new std::thread(&MovingMapObject::doWork, mmo);
    thr->detach();

    return 0;
}
}

Использую sdk_operatorse.zip и ГИС Оператор отсюда https://gisinfo.ru/download/download_linux.htm
ОС Astra Linux SE 1.6. Qt 4.8.7

Плагин загружается при старте ГИС Оператор с помощью параметра командной строки -t.

Плагин нужен для того чтобы в дальнейшем отображать на карте динамические точки и другую информацию, полученную из другого приложения.
 
А как Вы из потока будете управлять ГИС Оператором или картой?

Если Вам нужно управлять картой, чтобы в ГИС Операторе были видны изменения,
то Вы можете из автономного приложения, написанного в ГИС Конструкторе, подключиться к карте, открытой на ГИС Сервере, и менять ее через MAPAPI-интерфейс.
ГИС Операторы, открывшие эту же карту на ГИС Сервере по сети TCP\IP (удаленно), будут автоматически отображать все изменения
с заданной в их настройках периодичностью обновления.

Если Вам нужно управлять конкретным экземпляром ГИС Оператора, то Вы можете написать прикладную задачу на PANAPI-интерфейсе.
Она будет получать уведомления о действиях Оператора, управлять окном карты и может иметь фоновый поток для неких действий.
Это более сложная в реализации архитектура.

Аварийное завершение Вашего примера может быть связано, например, с тем, что Вы запускаете поток,
который возможно висит в памяти и завершаете функцию, вместе с которой библиотека выгружается из памяти.
Задача на PANAPI работает по другому. Создается пользовательский класс (объект), который существует до принудительного завершения задачи
или закрытия всех окон карт.
 
Спасибо за ответ.

С PANAPI на первый взгляд всё получилось. Потоки запускаются ничего не падает.

Тогда вопрос в догонку:
Нельзя ли сделать чтобы PANAPI задача загружалась при открытии новой карты автоматически?
Т. е. если пользователь закрыл карту и открыл новую ему не было необходимости выполнять «Задачи→Запуск задач...»?

P.S.
Первый вариант я использовал из-за этих фраз в документации:
Цитата
Существует два вида таких задач.
Первый вид – это задачи, выполняемые в потоковом режиме без интерактивной работы оператора (пользователя) с изображением электронной карты. Например, конвертирование, трансформирование, сортировка, обновление и другие виды обработки данных.
Второй вид – это интерактивные задачи. Например, редактирование, решение расчетных задач, построение отчетов, работа с базами данных и так далее.
...
Вот я и решил что мне нужен первый вид.
А про то что библиотека будет выгружена из функции по выходу из `CallMapFunctionEx` я не догадался.
Изменено: usernametaken - 15.03.2019 12:38:34
Страницы: 1
Читают тему (гостей: 1)



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