Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

MapX и события

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Вт 03 Сен 2013 19:16    Заголовок сообщения: MapX и события Ответить с цитатой

В компоненте MapX (IngeoMapX.ocx) есть возможность подключится к событиям Ингео. В данном случае речь идёт о событиях создания/изменения/удаления пространственного объекта ингео.

Но похоже, что события срабатывают только для MapX, который собственно и создаёт/изменяет/удаляет объекты, а не как в скриптах Ингео - не важно в каком процессе создали объект, все клиенты получат это сообщение.

Собственно вопрос: MapXи не должен получать от сервера (и потом генерировать в своём процессе) события об изменении объектов, произошедшие в других клиентах (Ингео или MapX)?

код для теста (С#)
Код:

    [TestClass]
    public class UnitTest1
    {
        string testMethod1Log;

        [TestMethod]
        public void TestMethod1()
        {
            testMethod1Log = "";

            IngeoMapX.IngeoMapXControl mapx = new IngeoMapX.IngeoMapXControl();
            mapx.SpatialServer = "";
            mapx.SpatialDbID = "{948159FA-78EA-4A05-A3AF-EFF5371A875F}";
            mapx.SpatialLogonName = "Администратор";
            mapx.SpatialLogonPassword = "";
            mapx.DbActive = true;
            mapx.DbMapObjectsCreateComplete += mapx_DbMapObjectsCreateComplete;
            mapx.DbMapObjectsDeleteComplete += mapx_DbMapObjectsDeleteComplete;

            {
                IngeoMapX.IngeoMapXControl mapx2 = new IngeoMapX.IngeoMapXControl();
                mapx2.SpatialServer = "";
                mapx2.SpatialDbID = "{948159FA-78EA-4A05-A3AF-EFF5371A875F}";
                mapx2.SpatialLogonName = "Администратор";
                mapx2.SpatialLogonPassword = "";
                mapx2.DbActive = true;
                var mo = mapx2.Ingeo.ActiveDb.MapObjects;
                var o = mo.AddObject("00130000047F");//Данные Росреестра - Буфер загрузки\Земельные участки
                string OID = o.ID;
                var shape = o.Shapes.Insert(0, "001300000481");//Граница исходных ЗУ опред
                var cp = shape.Contour.Insert(0);
                cp.InsertVertex(-1, 1000, 1000, 0);
                cp.InsertVertex(-1, 1000, 2000, 0);
                cp.InsertVertex(-1, 2000, 2000, 0);
                cp.InsertVertex(-1, 2000, 1000, 0);
                cp.Closed = true;
                mo.UpdateChanges();

                mo = mapx2.Ingeo.ActiveDb.MapObjects;
                mo.DeleteObject(OID);
                mo.UpdateChanges();
            }

            mapx.DbMapObjectsDeleteComplete -= mapx_DbMapObjectsDeleteComplete;
            mapx.DbMapObjectsCreateComplete -= mapx_DbMapObjectsCreateComplete;
            mapx.DbActive = false;

            ///            Thread.Sleep(1000*60*5);

            string expected = "DbMapObjectsCreateComplete; DbMapObjectsDeleteComplete; ";
            Assert.AreEqual(expected, testMethod1Log);
        }

        void mapx_DbMapObjectsDeleteComplete(string aMapObjectID, bool aMy)
        {
            testMethod1Log += "DbMapObjectsDeleteComplete; ";
        }

        void mapx_DbMapObjectsCreateComplete(string aMapObjectID, bool aMy)
        {
            testMethod1Log += "DbMapObjectsCreateComplete; ";           
        }
}

есть аналог на делфе, могу тоже выложить...

_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 04 Сен 2013 11:10    Заголовок сообщения: Ответить с цитатой

Обработка событий от сервера выполняется в цикле обработки оконных сообщений (message loop).

Вместо Thread.Sleep нужно вызывать Application.ProcessMessages (на Delphi). На .Net аналога не помню, но тоже должен быть.

Однако гарантии нет, что сообщения от сервера успеют придти сразу после Commit-a.

Для гарантированной обработки вам надо после Commit-а крутить mesage loop до тех пор, пока не придут оповещения, либо пока не истечет некий лимит времени на ожидание.

Вместо ProcessMessage в модульном тесте можно организовать собственный message loop:
Код:

var startTime = DateTime.Now;
MSG msg;
eventsTriggered = false;
while(true) {
    if(PeekMessage(ref msg, 0, 0, 0)) {
        DispatchMessage(ref msg);
    }
    if(eventsTriggered) {
      break;
    }
    Thread.Sleep(1);
    if(DateTime.Now - startTime > timeLimit) {
       break;
    }
}
Assert(eventsTriggered);

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
APopov



Зарегистрирован: 19.06.2006
Сообщения: 347
Откуда: Самара

СообщениеДобавлено: Ср 04 Сен 2013 14:40    Заголовок сообщения: Ответить с цитатой

Спасибо, помогло!
_________________
ОАО "Самара-Информспутник",
инженер-программист Попов Артем
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB