コード例 #1
0
        /// <summary>
        /// Обработчик события 'EvtDataAskedHostQueue'
        /// </summary>
        /// <param name="par">Параметры/аргументы события</param>
        private void onEvtDataAskedHostQueue_GroupSources(object par)
        {
            EventArgsDataHost ev = par as EventArgsDataHost;

            object [] pars = ev.par as object [];

            // массив параметров
            // id_main - индекс типа группы источников (INDEX_SRC)
            // id_detail - индекс группы источников (идентификатор)
            //  'par' различается в ~ от типа объекта в 'pars[0]'
            // для 'GroupSourcesSrc, GroupSourcesDest' - длина=3 (набор исходный): [0] - индекс группы сигналов, [1] - команда, [2 | при необходимости] - 'ID_HEAD_ASKED_HOST'
            // для 'GroupSourcesDest' - длина=2 (набор изменен): [0] - объект 'GroupSourcesDest', [1] - команда
            GroupSourcesDest grpSrcDest = null;                              // только для 2-го набора
            int indx = -1;                                                   // для разных наборов - различное значение
            ID_HEAD_ASKED_HOST idHeadAskedHost = ID_HEAD_ASKED_HOST.UNKNOWN; // только для исходного набора (для [START | STOP] всегда = 'CONFIRM')
            ID_DATA_ASKED_HOST id_cmd          = (ID_DATA_ASKED_HOST)pars[1];

            if (pars[0].GetType().IsPrimitive == true)
            {                        // действия по набору-1
                indx = (int)pars[0]; // индекс группы сигналов
                if (pars.Length == 2)
                {
                    // единственный параметр
                    switch (id_cmd)
                    {
                    //case ID_DATA_ASKED_HOST.START:
                    //    add(new object [] { ev.id_main, indx }, TimeSpan.FromMilliseconds (16667));
                    //    break;
                    case ID_DATA_ASKED_HOST.STOP:
#if _STATE_MANAGER
                        remove(ev.id_main, ev.id_detail, indx);
#endif
                        break;

                    case ID_DATA_ASKED_HOST.TABLE_RES:
#if _STATE_MANAGER
                        update(ev.id_main, ev.id_detail, indx);
#endif
                        break;

                    default:
                        break;
                    }
                }
                else
                // 3 параметра
                if (pars.Length == 3)
                {
                    if (pars[2].GetType().IsEnum == true)
                    {    //ID_DATA_ASKED_HOST.START, ID_DATA_ASKED_HOST.STOP; ID_HEAD_ASKED_HOST.CONFIRM
                        idHeadAskedHost = (ID_HEAD_ASKED_HOST)pars[2];

                        if (idHeadAskedHost == ID_HEAD_ASKED_HOST.CONFIRM)
#if _STATE_MANAGER
                        { confirm(ev.id_main, ev.id_detail, indx)
#else
#endif
                          ; }
                        else
                        {
                            // ошибка - переменная имеет непредвиденное значение
                            throw new MissingMemberException(@"HHandleQueue::onEvtDataAskedHostQueue_GroupSources () - ...");
                        }
                    }
                    else
                    {    //ID_DATA_ASKED_HOST.START
#if _STATE_MANAGER
                        // добавить группу сигналов в список контролируемых
                        add(new object[] { ev.id_main, ev.id_detail, indx }, TimeSpan.FromMilliseconds(((TimeSpan)pars[2]).TotalMilliseconds));
#else
#endif
                    }
                }
                else
                {
                    ;     // других вариантов по количеству параметров - нет
                }
            }
            else
            {// действия по набору-2 (для установления взаимосвязи между "связанными" (по конф./файлу) по "цепочке" сигналов - групп сигналов - групп источников)
                if (pars[0] is GroupSourcesDest)
                {
                    grpSrcDest = pars[0] as GroupSourcesDest;
                    indx       = ev.id_detail; // индекс группы источников

                    foreach (GroupSources grpSrcSource in m_listGroupSources[(int)INDEX_SRC.SOURCE])
                    {
                        if (FormMain.FileINI.GetIDIndex(grpSrcSource.m_strID) == indx) //indxNeededGroupSources
                        {
                            if (id_cmd == ID_DATA_ASKED_HOST.START)
                            {
                                grpSrcSource.AddDelegatePlugInOnEvtDataAskedHost(FormMain.FileINI.GetIDIndex(grpSrcDest.m_strID), grpSrcDest.Clone_OnEvtDataAskedHost);
                            }
                            else
                            if (id_cmd == ID_DATA_ASKED_HOST.STOP)
                            {
                                grpSrcSource.RemoveDelegatePlugInOnEvtDataAskedHost(FormMain.FileINI.GetIDIndex(grpSrcDest.m_strID), grpSrcDest.Clone_OnEvtDataAskedHost);
                            }
                            else
                            {
                                ;
                            }

                            break;
                        }
                        else
                        {
                            ;
                        }
                    }
                }
                else
                {
                    // ошибка - объект имеет неизвестный тип
                    throw new InvalidCastException(@"HHandleQueue::onEvtDataAskedHostQueue_GroupSources () - ...");
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Обработчик события 'EvtDataAskedHostQueue'
        /// </summary>
        /// <param name="par">Параметры/аргументы события</param>
        private void onEvtDataAskedHostQueue_GroupSources(object par)
        {
            EventArgsDataHost ev = par as EventArgsDataHost;

            object [] pars = ev.par as object [];

            // массив параметров
            // id_main - индекс типа группы источников (FormMain.INDEX_SRC.)
            // id_detail - индекс группы источников (идентификатор)
            //  'par' различается в ~ от типа объекта в 'pars[0]'
            // для 'GroupSourcesSrc, GroupSourcesDest' - длина=3 (набор исходный): [0] - индекс группы сигналов, [1] - команда, [2 | при необходимости] - 'ID_HEAD_ASKED_HOST'
            // для 'GroupSourcesDest' - длина=2 (набор изменен): [0] - объект 'GroupSourcesDest', [1] - команда
            GroupSourcesDest grpSrcDest = null;                              // только для 2-го набора
            int indx = -1;                                                   // для разных наборов - различное значение
            ID_HEAD_ASKED_HOST idHeadAskedHost = ID_HEAD_ASKED_HOST.UNKNOWN; // только для исходного набора (для [START | STOP] всегда = 'CONFIRM')
            ID_DATA_ASKED_HOST id_cmd          = (ID_DATA_ASKED_HOST)pars[1];
            List <int>         listLinkedIndexGroupSignals;

            if (pars[0].GetType().IsPrimitive == true)
            {                        // действия по набору-1
                indx = (int)pars[0]; // индекс группы сигналов
                if (pars.Length == 2)
                {
                    switch (id_cmd)
                    {
                    //case ID_DATA_ASKED_HOST.START:
                    //    add(new object [] { ev.id_main, indx }, TimeSpan.FromMilliseconds (16667));
                    //    break;
                    case ID_DATA_ASKED_HOST.STOP:
#if _STATE_MANAGER
                        remove(ev.id_main, ev.id_detail, indx);
#endif
                        break;

                    default:
                        break;
                    }
                }
                else
                // 3 параметра
                if (pars.Length == 3)
                {
                    if (pars[2].GetType().IsPrimitive == true)
                    {
                        // примитивное значение - кол-во строк в таблице результата
                        switch (id_cmd)
                        {
                        case ID_DATA_ASKED_HOST.TABLE_RES:
#if _STATE_MANAGER
                            update(ev.id_main, ev.id_detail, indx);
                            // если группа сигналов группы источников принадлежит к источникам информации
                            if ((FormMain.INDEX_SRC.)ev.id_main == FormMain.INDEX_SRC.SOURCE)
                            {
                                // проверить кол-во строк в таблице результата
                                // в случае отсутствия строк, требуется обновить связанные с ней группы сигналов в группах источников назначения
                                // т.к. самостоятельно такие группы сигналов не обновляются, что м. привести к периодической выгрузке/загрузке библиотеки
                                if ((int)pars[2] == 0)
                                {
                                    // искать группы сигналов в группах источников назначения, связанные с указанной в аргументе
                                    foreach (GroupSourcesDest grp in m_listGroupSources[(int)FormMain.INDEX_SRC.DEST])
                                    {
                                        // найти в группе источников назначения такие группы сигналов, которые связаны с указанной в аргументе группой сигналов
                                        listLinkedIndexGroupSignals = grp.GetListLinkedIndexGroupSignals(ev.id_detail, indx);

                                        listLinkedIndexGroupSignals.ForEach(indxGrpSgnls => { update(FormMain.INDEX_SRC.DEST, FormMain.FileINI.GetIDIndex(grp.m_strID), indxGrpSgnls); });
                                    }
                                }
                                else
                                {
                                    ;
                                }
                            }
                            else
                            {
                                ;
                            }
#endif
                            break;
コード例 #3
0
        /// <summary>
        /// Передать в очередь обработки событий сообщение о необходимости установления/разрыва связи между группами источников
        /// </summary>
        /// <param name="ev">Аргумент при передаче сообщения</param>
        public override void PerformDataAskedHostQueue(EventArgsDataHost ev)
        {
            //id_main - идентификатор типа объекта в загруженной в ОЗУ библиотеки
            //id_detail - команда на изменение состояния группы сигналов
            //В 0-ом параметре передан индекс (???идентификатор) группы сигналов
            int indxGrpSgnls = (int)(ev.par as object[])[0];
            //Во 2-ом параметре передан признак инициирования/подтверждения изменения состояния группы сигналов
            ID_DATA_ASKED_HOST idDataAskedHost = (ID_DATA_ASKED_HOST)(ev.par as object[])[1];

            ////Во 2-ом параметре передан признак инициирования/подтверждения изменения состояния группы сигналов
            //ID_HEAD_ASKED_HOST idHeadAskedHost = (ID_HEAD_ASKED_HOST)(ev.par as object[])[2];

            base.PerformDataAskedHostQueue(ev);

            List <int> listNeededIndexGroupSources = GetListNeededIndexGroupSources(indxGrpSgnls);
            bool       bEvtDataAskedHostQueue      = false;

            lock (this) {
                foreach (int indx in listNeededIndexGroupSources)
                {
                    bEvtDataAskedHostQueue = false;

                    if (m_dictLinkedIndexGroupSources.ContainsKey(indx) == true)
                    {
                        if (idDataAskedHost == ID_DATA_ASKED_HOST.START)
                        {
                            m_dictLinkedIndexGroupSources[indx].Add(indxGrpSgnls);

                            if (m_dictLinkedIndexGroupSources[indx].Count == 1)
                            {
                                bEvtDataAskedHostQueue = true;
                            }
                            else
                            {
                                ;
                            }
                        }
                        else
                        if (idDataAskedHost == ID_DATA_ASKED_HOST.STOP)
                        {
                            m_dictLinkedIndexGroupSources[indx].Remove(indxGrpSgnls);

                            if (m_dictLinkedIndexGroupSources[indx].Count == 0)
                            {
                                // удаление выполнено корректно
                                bEvtDataAskedHostQueue = true;
                            }
                            else
                            {
                                ;
                            }
                        }
                        else
                        {
                            ;
                        }
                    }
                    else
                    {
                        ;
                    }

                    if (bEvtDataAskedHostQueue == true)
                    {
                        base.PerformDataAskedHostQueue(new EventArgsDataHost(
                                                           (int)FormMain.INDEX_SRC.SOURCE //!!! подмена - передать "чужой" тип группы источников (не используется в обработчике)
                                                           , indx                         //!!! подмена - передать индекс "чужой" группы источников, но связанной с текущей
                                                           , new object[] { this          //!!! подмена - вместо идентификатора группы сигналов: сам текущий объект группы источников
                                                                            , ev.par[1] } // стандартно - команда, копия из полученного объекта - аргумента события
                                                           ));
                    }
                    else
                    {
                        ;
                    }
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Обработчик события 'EvtDataAskedHostQueue'
        /// </summary>
        /// <param name="par">Параметры/аргументы события</param>
        private void onEvtDataAskedHostQueue_GroupSources(object par)
        {
            EventArgsDataHost ev = par as EventArgsDataHost;

            object [] pars = ev.par as object [];

            // массив параметров
            // id_main - индекс типа группы источников (FormMain.INDEX_SRC.)
            // id_detail - индекс группы источников (идентификатор)
            //  'par' различается в ~ от типа объекта в 'pars[0]'
            // для 'GroupSourcesSrc, GroupSourcesDest' - длина=3 (набор исходный): [0] - индекс группы сигналов, [1] - команда, [2 | при необходимости] - 'ID_HEAD_ASKED_HOST'
            // для 'GroupSourcesDest' - длина=2 (набор изменен): [0] - объект 'GroupSourcesDest', [1] - команда
            GroupSourcesDest grpSrcDest = null;                              // только для 2-го набора
            int indx = -1;                                                   // для разных наборов - различное значение
            ID_HEAD_ASKED_HOST idHeadAskedHost = ID_HEAD_ASKED_HOST.UNKNOWN; // только для исходного набора (для [START | STOP] всегда = 'CONFIRM')
            ID_DATA_ASKED_HOST id_cmd          = (ID_DATA_ASKED_HOST)pars[1];
            List <int>         listLinkedIndexGroupSignals;

            if (pars[0].GetType().IsPrimitive == true)
            {                        // действия по набору-1
                indx = (int)pars[0]; // индекс группы сигналов
                if (pars.Length == 2)
                {
                    switch (id_cmd)
                    {
                    //case ID_DATA_ASKED_HOST.START:
                    //    add(new object [] { ev.id_main, indx }, TimeSpan.FromMilliseconds (16667));
                    //    break;
                    case ID_DATA_ASKED_HOST.STOP:
#if _STATE_MANAGER
                        remove(ev.id_main, ev.id_detail, indx);
#endif
                        break;

                    default:
                        break;
                    }
                }
                else
                // 3 параметра
                if (pars.Length == 3)
                {
                    if (pars[2].GetType().IsPrimitive == true)
                    {
                        // примитивное значение - кол-во строк в таблице результата
                        switch (id_cmd)
                        {
                        case ID_DATA_ASKED_HOST.TABLE_RES:
#if _STATE_MANAGER
                            update(ev.id_main, ev.id_detail, indx);
                            // если группа сигналов группы источников принадлежит к источникам информации
                            if ((FormMain.INDEX_SRC)ev.id_main == FormMain.INDEX_SRC.SOURCE)
                            {
                                // проверить кол-во строк в таблице результата
                                // в случае отсутствия строк, требуется обновить связанные с ней группы сигналов в группах источников назначения
                                // т.к. самостоятельно такие группы сигналов не обновляются, что м. привести к периодической выгрузке/загрузке библиотеки
                                if ((int)pars[2] == 0)
                                {
                                    // искать группы сигналов в группах источников назначения, связанные с указанной в аргументе
                                    foreach (GroupSourcesDest grp in m_listGroupSources[(int)FormMain.INDEX_SRC.DEST])
                                    {
                                        // найти в группе источников назначения такие группы сигналов, которые связаны с указанной в аргументе группой сигналов
                                        listLinkedIndexGroupSignals = grp.GetListLinkedIndexGroupSignals(ev.id_detail, indx);

                                        listLinkedIndexGroupSignals.ForEach(indxGrpSgnls => { update(FormMain.INDEX_SRC.DEST, FormMain.FileINI.GetIDIndex(grp.m_strID), indxGrpSgnls); });
                                    }
                                }
                                else
                                {
                                    ;
                                }
                            }
                            else
                            {
                                ;
                            }
#endif
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    if (pars[2].GetType().IsEnum == true)
                    {
                        //ID_DATA_ASKED_HOST.START, ID_DATA_ASKED_HOST.STOP; ID_HEAD_ASKED_HOST.CONFIRM
                        idHeadAskedHost = (ID_HEAD_ASKED_HOST)pars[2];

                        if (idHeadAskedHost == ID_HEAD_ASKED_HOST.CONFIRM)
#if _STATE_MANAGER
                        { confirm(ev.id_main, ev.id_detail, indx)
#else
#endif
                          ; }
                        else
                        {
                            // ошибка - переменная имеет непредвиденное значение
                            throw new MissingMemberException(@"HHandleQueue::onEvtDataAskedHostQueue_GroupSources () - ...");
                        }
                    }
                    else            //ID_DATA_ASKED_HOST.START - объект 'TimeSpan'
                    {
#if _STATE_MANAGER
                        // добавить группу сигналов в список контролируемых
                        add(new object[] { ev.id_main, ev.id_detail, indx }, (TimeSpan)pars[2]);
#else
#endif
                    }
                }
                else
                {
                    ;         // других вариантов по количеству параметров - нет
                }
            }
            else
            {// действия по набору-2 (для установления взаимосвязи между "связанными" (по конф./файлу) по "цепочке" сигналов - групп сигналов - групп источников)
                if (pars[0] is GroupSourcesDest)
                {
                    grpSrcDest = pars[0] as GroupSourcesDest;
                    indx       = ev.id_detail;                                                                // индекс "чужой-связанной" группы источников

                    foreach (GroupSources grpSrcSource in m_listGroupSources[(int)FormMain.INDEX_SRC.SOURCE]) // можно использовать 'ev.id_main'
                    {
                        if (FormMain.FileINI.GetIDIndex(grpSrcSource.m_strID) == indx)                        //indxNeededGroupSources
                        {
                            if (id_cmd == ID_DATA_ASKED_HOST.START)
                            {
                                grpSrcSource.AddDelegatePlugInOnEvtDataAskedHost(FormMain.FileINI.GetIDIndex(grpSrcDest.m_strID), grpSrcDest.Clone_OnEvtDataAskedHost);
                            }
                            else
                            if (id_cmd == ID_DATA_ASKED_HOST.STOP)
                            {
                                grpSrcSource.RemoveDelegatePlugInOnEvtDataAskedHost(FormMain.FileINI.GetIDIndex(grpSrcDest.m_strID), grpSrcDest.Clone_OnEvtDataAskedHost);
                            }
                            else
                            {
                                ;
                            }

                            break;
                        }
                        else
                        {
                            ;
                        }
                    }
                }
                else
                {
                    // ошибка - объект имеет неизвестный тип
                    throw new InvalidCastException(@"HHandleQueue::onEvtDataAskedHostQueue_GroupSources () - ...");
                }
            }
        }