Сделал простой плагин к ГИС Оператору в котором пытаюсь создать новый поток. В этом случае ГИС Оператор с загруженным плагином падает. Поток пробовал создавать разными способами: 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;
}
}
А как Вы из потока будете управлять ГИС Оператором или картой?
Если Вам нужно управлять картой, чтобы в ГИС Операторе были видны изменения, то Вы можете из автономного приложения, написанного в ГИС Конструкторе, подключиться к карте, открытой на ГИС Сервере, и менять ее через MAPAPI-интерфейс. ГИС Операторы, открывшие эту же карту на ГИС Сервере по сети TCP\IP (удаленно), будут автоматически отображать все изменения с заданной в их настройках периодичностью обновления.
Если Вам нужно управлять конкретным экземпляром ГИС Оператора, то Вы можете написать прикладную задачу на PANAPI-интерфейсе. Она будет получать уведомления о действиях Оператора, управлять окном карты и может иметь фоновый поток для неких действий. Это более сложная в реализации архитектура.
Аварийное завершение Вашего примера может быть связано, например, с тем, что Вы запускаете поток, который возможно висит в памяти и завершаете функцию, вместе с которой библиотека выгружается из памяти. Задача на PANAPI работает по другому. Создается пользовательский класс (объект), который существует до принудительного завершения задачи или закрытия всех окон карт.
С PANAPI на первый взгляд всё получилось. Потоки запускаются ничего не падает.
Тогда вопрос в догонку: Нельзя ли сделать чтобы PANAPI задача загружалась при открытии новой карты автоматически? Т. е. если пользователь закрыл карту и открыл новую ему не было необходимости выполнять «Задачи→Запуск задач...»?
P.S. Первый вариант я использовал из-за этих фраз в документации:
Цитата
Существует два вида таких задач. Первый вид – это задачи, выполняемые в потоковом режиме без интерактивной работы оператора (пользователя) с изображением электронной карты. Например, конвертирование, трансформирование, сортировка, обновление и другие виды обработки данных. Второй вид – это интерактивные задачи. Например, редактирование, решение расчетных задач, построение отчетов, работа с базами данных и так далее. ...
Вот я и решил что мне нужен первый вид. А про то что библиотека будет выгружена из функции по выходу из `CallMapFunctionEx` я не догадался.