/// <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 () - ..."); } } }
/// <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;
/// <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 { ; } } } }
/// <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 () - ..."); } } }