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

Бесконечное обращение к серверу при использовании метода mapPaintToXImage

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 След.
RSS
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Диагностика при использовании функции mapPaintToXImage ориентирована на определение ошибок, связанных непосредственно с процессом рисования. В данном случае, поскольку в карте отсутствует информация об объектах, картинка на выходе просто залита фоном карты.
Явный контроль состояния кэша ставить как отдельную задачу не совсем корректно, поскольку сам по себе кэш является внутренним средством работы ГИС-ядра.
Для диагностики описываемых Вами ситуаций можно контролировать состояние соединения с ГИС Сервером с помощью средств, обсуждаемых ранее.
 
Так я же и говорю про средства, обсуждаемые ранее, не связанные с функцией mapPaintToXImage.
Цитата
Александр Савелов написал:
Соответственно после синхронизации состояния с помощью mapAdjustData, функция mapIsServerActive вернет обновленный статус соединения с сервером.

Цитата
Андрей Лаптев написал:
Проверил работу методов mapAdjustData и последующего mapIsServerActive - это работает только в случае остановки сервиса ГИС Сервера на работающем компьютере. Если же отключить этот компьютер из сети или просто выключить - mapIsServerActive продолжает всегда возвращать положительное значение.
 
mapIsServerActive нужно вызывать после mapAdjustDat.
 
Так и делаю:

Во время работы сервера отключаем его от сети(выдергиваем кабель).
После этого периодически вызываем код ниже:

long int result = mapAdjustData(d->hMap); // result всегда = 0
long int serverActive = mapIsServerActiveEx(d->serverConnection); // serverActive всегда = 1

После подключения к сети при первом запросе выводится ошибка "Ошибка приема данных с сервера - Read fault". Далее карта работает штатно.

Если же на работающем компьютере остановить gsservice, то тогда при вызове функции mapAdjustData возникает штатный SIGPIPE и выводится ошибка "Ошибка соединения с Сервером, код ошибки - 111".
После чего функция mapIsServerActiveEx(d->serverConnection) возвращает 0 и мы можем корректно обработать данную ситуацию.

Можно ли как-то определять недоступность сервера в случае его пропадания из сети, а не только остановки gsservice?
Изменено: Андрей Лаптев - 03.08.2017 08:16:46
 
Данную ситуацию с пропаданием подключения по сети воспроизвели, недоработку исправили, изменения войдут в следующую версию ГИС Конструктор.
Спасибо!
 
Хорошо, напишите пожалуйста, как будет готова.

Еще заметили такую проблему, связанную с подключением: если воспроизвести ситуацию
Цитата
Андрей Лаптев написал:
Если же на работающем компьютере остановить gsservice, то тогда при вызове функции mapAdjustData возникает штатный SIGPIPE и выводится ошибка "Ошибка соединения с Сервером, код ошибки - 111".
После чего функция mapIsServerActiveEx(d->serverConnection) возвращает 0 и мы можем корректно обработать данную ситуацию.
и после закрыть карту и соединение:
mapCloseData(d->hMap);
mapCloseConnect(d->serverConnection); // Возвращает 1

то при повторном подключении и открытии карты возникает segmentationFault:
1 TMapLink::GetMapSocket(int&) 0x7fffddf8dd28 2 TMapLink::Read(int, int, int, unsigned int, char *, int) 0x7fffddf94840
3 TMapRsc::OpenAliasRsc(wchar_t const *, int, unsigned long, int, char *, int) 0x7fffddd6f795
4 TRscList::OpenAlias(wchar_t const *, int, unsigned long, int, char *, int, int *) 0x7fffddf61cb4
5 TMap::OpenRsc(wchar_t const *) 0x7fffddf620f8
6 TMap::OpenMap(wchar_t const *, int, wchar_t const *, int, int) 0x7fffddf627ba
7 TMap::OpenData(wchar_t const *, int, wchar_t const *, int) 0x7fffddf63fa9
8 TMapControl::OpenMap(wchar_t const *, int, wchar_t const *, int) 0x7fffddceb754
9 TMapAccess::OpenMap(wchar_t const *, int, wchar_t const *, int) 0x7fffddcb84d9
10 TMapAccess::OpenData(wchar_t const *, int, long *, wchar_t const *, int) 0x7fffddcbb3ec
11 mapOpenAnyDataPro 0x7fffddcc1551

Если же перед закрытием карты очистить кэш через
mapClearDocCache(d->hMap);
то все отрабатывает нормально.

Но если вместо переподключения просто закрыть программу и заново запустить, то подключение к серверу и открытие карты пройдет нормально, т.е. проблема в переподключении в текущем сеансе.
Изменено: Андрей Лаптев - 03.08.2017 10:25:35
 
Данную ситуацию пока не удалось воспроизвести. Правильно ли я понимаю, что Вы выполняете следующую последовательность действий:
- подключаетесь к ГИС Серверу;
- останавливаете ГИС Сервер;
- закрываете подключение;

- запускаете ГИС Сервер;
- повторно подключаетесь и получаете ошибку.

Не могли бы Вы привести примеры функций, с помощью которых Вы подключаетесь к ГИС Серверу и закрываете соединение.
 
Да, последовательность действий такая. Только функцию mapAdjustData обязательно вызываем после остановки ГИС Сервера для определения потери соединения.

// Подключение к ГИС Серверу
long int serverConnection = mapOpenConnectUn(serverParameters.host.utf16(), serverParameters.port);
if(serverConnection)
       {
   WCHAR path[255];
   mapBuildAliasNameUn(serverParameters.host.utf16(), serverParameters.port, serverParameters.mapAlias.utf16(), path, 255);
   TMCUSERPARM parm; // Подготовленные параметры с хэшем
   if(mapRegisterUserEx(serverConnection, &parm);
   {
       hMap = mapOpenDataUn(path, GENERIC_READ);
   }
}

// Синхронизируемся и проверяем соединение
mapAdjustData(hMap);
if(!mapIsServerActiveEx(serverConnection))
{
   mapCloseData(hMap);
   mapCloseConnect(serverConnection);
}

Далее заново проводим подключение как написано выше.
 
Здравствуйте, Андрей.  
Ситуацию с пропаданием подключения по сети исправили. Обновленный ГИС Конструктор Вы можете скачать по следующей ссылке
Ситуацию с возникновением  segmentationFault в этой версии ГИС Конструктор повторить не удалось.
 
Цитата
Андрей Лаптев написал:
Да, последовательность действий такая. Только функцию mapAdjustData обязательно вызываем после остановки ГИС Сервера для определения потери соединения.

// Подключение к ГИС Серверу
long int serverConnection = mapOpenConnectUn(serverParameters.host.utf16(), serverParameters.port);
if(serverConnection)
       {
   WCHAR path[255];
   mapBuildAliasNameUn(serverParameters.host.utf16(), serverParameters.port, serverParameters.mapAlias.utf16(), path, 255);
   TMCUSERPARM parm; // Подготовленные параметры с хэшем
   if(mapRegisterUserEx(serverConnection, &parm);
   {
       hMap = mapOpenDataUn(path, GENERIC_READ);
   }
}

// Синхронизируемся и проверяем соединение
mapAdjustData(hMap);
if(!mapIsServerActiveEx(serverConnection))
{
   mapCloseData(hMap);
   mapCloseConnect(serverConnection);
}

Далее заново проводим подключение как написано выше.

Функция mapAdjustData сама переоткрывает соединение и карту, как только связь будет восстановлена.
В общем случае может быть много карт и соединений. Сложно учесть все открытые данные и их переоткрыть. К тому же при переоткрытии меняются идентификаторы данных, что не всегда удобно.
Проверка активности соединения может быть нужна для индикации соединения и блокирования операций редактирования удаленных данных, когда нет соединения.
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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