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

Андрей Лаптев (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Андрей Лаптев
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 След.
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Понятно, у нас просто немного другой случай - для большей отказоустойчивости используются две подсети параллельно. Соединение с ГИС-Сервером мы открываем по первой работающей. В случае потери соединения мы не можем ждать восстановления подключения, периодически вызывая функцию mapAdjustData, а переключаемся на другую доступную подсеть. Но в этом случае нам приходится пересоздавать соединение и переподключаться к карте. Или достаточно пересоздать подключение, а карту не переоткрывать?
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Да, последовательность действий такая. Только функцию 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);
}

Далее заново проводим подключение как написано выше.
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Хорошо, напишите пожалуйста, как будет готова.

Еще заметили такую проблему, связанную с подключением: если воспроизвести ситуацию[QUOTE]Андрей Лаптев написал:
Если же на работающем компьютере остановить gsservice, то тогда при вызове функции mapAdjustData возникает штатный SIGPIPE и выводится ошибка "Ошибка соединения с Сервером, код ошибки - 111".
После чего функция mapIsServerActiveEx(d->serverConnection) возвращает 0 и мы можем корректно обработать данную ситуацию.
[/QUOTE]
и после закрыть карту и соединение:
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
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Так и делаю:

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

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
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Так я же и говорю про средства, обсуждаемые ранее, не связанные с функцией mapPaintToXImage.[QUOTE]Александр Савелов написал:
Соответственно после синхронизации состояния с помощью mapAdjustData, функция mapIsServerActive вернет обновленный статус соединения с сервером.
[/QUOTE]

[QUOTE]Андрей Лаптев написал:
Проверил работу методов mapAdjustData и последующего mapIsServerActive - это работает только в случае остановки сервиса ГИС Сервера на работающем компьютере. Если же отключить этот компьютер из сети или просто выключить - mapIsServerActive продолжает всегда возвращать положительное значение.
[/QUOTE]
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Да, вы правы, извиняюсь:)

Проверил работу методов mapAdjustData и последующего mapIsServerActive - это работает только в случае остановки сервиса ГИС Сервера на работающем компьютере. Если же отключить этот компьютер из сети или просто выключить - mapIsServerActive продолжает всегда возвращать положительное значение.
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
То же самое происходит, если попытаться вызвать mapAdjustData после остановки и старта сервера во время работающего подключения.
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
[QUOTE]Александр Савелов написал:
Соответственно после синхронизации состояния с помощью mapAdjustData, функция mapIsServerActive вернет обновленный статус соединения с сервером.[/QUOTE]
Попробовал реализовать предложенный вариант, программа падает со следующим стеком:
1 __libc_send send.c 26 0x7ffff61213ff 2 TMapSocket::Send(const char *, int, unsigned int) 0x7fffddf8a87c
3 TMapSocket::CheckMode(int *, unsigned long, wchar_t const *, int *) 0x7fffddf94eb3
4 TMapLink::CheckMode(int *, unsigned long, wchar_t const *, int *) 0x7fffddf9513b
5 TMapStorage::CheckMode(int&) 0x7fffddf6a5a6
6 TMap::AdjustData() 0x7fffddf640eb
7 TMapControl::AdjustData() 0x7fffddcebd59
8 mapAdjustData 0x7fffddcc6f08
9 PanoramaMap::mapFrameImage panorama_map.cpp 366 0x7fffdfacf4a6
Бесконечное обращение к серверу при использовании метода mapPaintToXImage
 
Жаль, что нельзя отследить проблему с доступом к серверу. То есть, так как данные кэшируются, то запрос к серверу отправляется только для отсутствующих данных, и нам не очень критично разрыв связи при наличии кэша. Но фунция mapPaintToXImage всегда возвращает ненулевое значение(и пустую картинку) даже при отсутствии кэша и доступу к серверу. [QUOTE]Александр Савелов написал:
Соответственно после синхронизации состояния с помощью mapAdjustData, функция mapIsServerActive вернет обновленный статус соединения с сервером.[/QUOTE]
С помощью методов mapAdjustData и mapIsServerActive мы можем определить, что произошел разрыв связи, но это может не быть проблемой при наличии кэша, но вот отсутствие данных в кэше для формировании картинки никак определить не можем.
Не работает функция mapSetMessageBoxCall
 
Понятно, жаль, нам было бы весьма полезно использовать это уже в текущих проектах.
Страницы: 1 2 3 4 5 6 7 8 След.



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

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