/// <summary> /// Обработчик события приема сообщений от вкладки (панели) "Конфигурация" /// </summary> /// <param name="obj">Массив объектов сообщения</param> private void OnEvtDataAskedFormMain_PanelConfig(object obj) { EventArgsDataHost ev = obj as EventArgsDataHost; //ev.id - здесь всегда = -1 m_handler.Push(m_panelConfig, ev.par as object[]); }
/// <summary> /// Обработчик запросов от клиента /// </summary> /// <param name="obj"></param> public override void OnEvtDataRecievedHost(object obj) { EventArgsDataHost ev = obj as EventArgsDataHost; //Переданные значения из-вне HHandlerDbULoader target = _object as HHandlerDbULoader; //Целевой объект switch (ev.id) { case (int)ID_DATA_ASKED_HOST.INIT_SOURCE: //Приняты параметры для инициализации целевого объекта target.Initialize(ev.par as object []); break; case (int)ID_DATA_ASKED_HOST.INIT_SIGNALS: //Приняты параметры инициализации группы сигналов //Инициализация группы сигналов по идентифактору [0] if (!(target.Initialize((int)(ev.par as object[])[0],(ev.par as object[])[1] as object[]) == 0)) { //??? ошибка ; } else { ; } break; case (int)ID_DATA_ASKED_HOST.START: //Принята команда на запуск группы сигналов //Проверить признак получения целевым объектом параметоров для инициализации if (m_markDataHost.IsMarked((int)ID_DATA_ASKED_HOST.INIT_SOURCE) == true) { //Инициализация группы сигналов по идентифактору [0] if (target.Initialize((int)(ev.par as object[])[0],(ev.par as object[])[1] as object[]) == 0) { //Запустить на выполнение группу сигналов target.Start((int)(ev.par as object[])[0]); } else { //Отправить запрос клиенту для получения параметров инициализации для группы сигналов DataAskedHost(new object[] { (int)ID_DATA_ASKED_HOST.INIT_SIGNALS,(int)(ev.par as object[])[0] }); } } else { //Отправить запрос клиенту для получения целевым объектом параметоров для инициализации DataAskedHost(new object[] { (int)ID_DATA_ASKED_HOST.INIT_SOURCE,(int)(ev.par as object[])[0] }); } break; case (int)ID_DATA_ASKED_HOST.STOP: target.Stop((int)(ev.par as object[])[0]); break; default: break; } //Вызвать метод "базового" объекта base.OnEvtDataRecievedHost(obj); }
protected override int StateResponse(int state,object obj) { int iRes = 0; ItemQueue itemQueue = Peek; CONN_SETT_TYPE type = CONN_SETT_TYPE.UNKNOWN; EventArgsDataHost arg; switch ((EVENT)state) { case EVENT.LIST_SIGNAL: type = (CONN_SETT_TYPE)itemQueue.Pars[1]; if (Signals.ContainsKey(type) == false) { Signals.Add(type,new List <SIGNAL>(obj as IList <SIGNAL>)); } else { Signals[type] = new List <SIGNAL>(obj as IList <SIGNAL>); } arg = new EventArgsDataHost(null,new object[] { (EVENT)state,type }); break; case EVENT.CUR_VALUES: case EVENT.CHECK_VALUES: type = (CONN_SETT_TYPE)itemQueue.Pars[0]; if (_values.ContainsKey(type) == false) { _values.Add(type,VALUES.Copy(obj as VALUES)); } else { _values[type] = VALUES.Copy(obj as VALUES); } // дополнительно передать ккс-код (для поиска столбца) arg = new EventArgsDataHost(null,new object[] { (EVENT)state,type,Signals[type].ElementAt((int)itemQueue.Pars[1]).kks_code }); break; default: arg = new EventArgsDataHost(null,new object[] { }); break; } itemQueue.m_dataHostRecieved.OnEvtDataRecievedHost(arg); return(iRes); }
/// <summary> /// /// </summary> /// <param name="ev"></param> public void OnEvtDataRecievedHost(EventArgsDataHost ev) { switch (ev.id) { case (int)ID_ASKED_DATAHOST.CONN_SETT: //Установить соедиение m_getDate = new HGetDate((ConnectionSettings)ev.par[0], recievedGetDate, errorGetDate); //Запустить поток m_getDate.StartDbInterfaces(); m_getDate.Start(); break; default: break; } }
/// <summary> /// Обработчик события - получение данных (по запросу) от сервера /// </summary> /// <param name="ev">Аргумент события - полученные данные</param> public void OnEvtDataRecievedHost(EventArgsDataHost ev) { switch (ev.id_detail) { case (int)ID_ASKED_DATAHOST.CONN_SETT: //получены параметры соединения //Установить соедиение - создать объект m_getDate = new HGetDate((ConnectionSettings)ev.par[0], recievedGetDate, errorGetDate); //Установить соедиение - запустить поток обработки(отправления) запросов m_getDate.StartDbInterfaces(); //Установить соедиение - начать обработку запросов m_getDate.Start(); break; default: break; } }
public override void OnEvtDataRecievedHost(object obj) { EventArgsDataHost ev = obj as EventArgsDataHost; HHandlerDbULoaderDest target = _object as HHandlerDbULoaderDest; switch (ev.id) { case (int)ID_DATA_ASKED_HOST.TO_INSERT: target.Insert((int)(ev.par as object[])[0],(ev.par as object[])[1] as DataTable,(ev.par as object[])[2] as object[]); break; default: break; } base.OnEvtDataRecievedHost(obj); }
/// <summary> /// Делегат обработки события - выбор п. меню /// </summary> /// <param name="obj">Объект, инициировавший событие (плюгИн вкладки)</param> private void FormMain_EvtDataAskedHost(EventArgsDataHost ev) { //??? повторная проверка типов аргументов сообщения // первоначально разбирается в 'Plugins.OnEvtDataAskedHost' if (ev.par[0] is ToolStripMenuItem) { this.BeginInvoke(new Action <EventArgsDataHost>(postOnClickMenuItem), ev); } else if ((ev.par[0].GetType().IsPrimitive == true) && ((HFunc.ID_FUNC_DATA_ASKED_HOST)ev.par[0] == HFunc.ID_FUNC_DATA_ASKED_HOST.MESSAGE_TO_STATUSSTRIP)) { // TODO: отобразить сообщение в строке статуса ; } else { throw new Exception(string.Format(@"Неизвестный объект для обработки из функциональной библиотеки...")); } }
private void onEvtCompleted(EventArgsDataHost ev) { HandlerSignalQueue.EVENT evt; CONN_SETT_TYPE type; SIGNAL signal; string kks_code = string.Empty; evt = (HandlerSignalQueue.EVENT)ev.par[0]; type = (CONN_SETT_TYPE)ev.par[1]; switch (evt) { case HandlerSignalQueue.EVENT.LIST_SIGNAL: m_panelManagement.InitializeSignalList(type,m_HandlerQueue.Signals[type].Select(sgnl => { return(sgnl.name_shr); })); break; case HandlerSignalQueue.EVENT.CUR_VALUES: draw(type); //m_threadDraw.RunWorkerAsync(type); break; case HandlerSignalQueue.EVENT.CHECK_VALUES: kks_code = (string)ev.par[2]; signal = m_HandlerQueue.Signals[type].FirstOrDefault(sgnl => { return(sgnl.kks_code.Equals(kks_code) == true); }); if (m_dictDataGridViewValues[type].ActionColumn(signal.kks_code ,signal.name_shr) == true) { // запросить значения для заполнения нового столбца //??? оптимизация, сравнение с предыдущим, полученным по 'SELECT', набором значений - должны совпадать => запрос не требуется m_dictDataGridViewValues[type].Fill(m_HandlerQueue.Values(type)); } else { // столбец удален - ничего не делаем ; } break; default: break; } }
public override void OnEvtDataRecievedHost(object obj) { EventArgsDataHost ev = obj as EventArgsDataHost; HHandlerDbULoaderDest target = _objects[KeySingleton] as HHandlerDbULoaderDest; switch (ev.id_detail) { case (int)ID_DATA_ASKED_HOST.TO_INSERT: target.Insert((int)(ev.par as object[])[0],(ev.par as object[])[1] as DataTable,(ev.par as object[])[2] as object[]); break; //case (int)ID_DATA_ASKED_HOST.TO_START: // target.InitSource(ev.par); // break; case (int)ID_DATA_ASKED_HOST.TO_STOP: target.Clear((int)(ev.par as object[])[0]); break; default: break; } base.OnEvtDataRecievedHost(obj); }
/// <summary> /// Обработчик события 'EvtDataAskedHostQueue' для установления взаимосвязи между "связанными" (по конф./файлу) по "цепочке" сигналов - групп сигналов - групп источников /// </summary> /// <param name="par">Параметры для установления соответствия</param> private void onEvtDataAskedHostQueue_GroupSourcesDest(object par) { EventArgsDataHost ev = par as EventArgsDataHost; object [] pars = ev.par as object []; GroupSourcesDest grpSrcDest = pars[0] as GroupSourcesDest; int indxNeededGroupSources = (int)pars[1]; foreach (GroupSources grpSrcSource in m_listGroupSources[(int)INDEX_SRC.SOURCE]) { if (FormMain.FileINI.GetIDIndex(grpSrcSource.m_strID) == indxNeededGroupSources) { if ((ID_DATA_ASKED_HOST)ev.id == ID_DATA_ASKED_HOST.START) { grpSrcSource.AddDelegatePlugInOnEvtDataAskedHost(FormMain.FileINI.GetIDIndex(grpSrcDest.m_strID), grpSrcDest.Clone_OnEvtDataAskedHost); } else if ((ID_DATA_ASKED_HOST)ev.id == ID_DATA_ASKED_HOST.STOP) { grpSrcSource.RemoveDelegatePlugInOnEvtDataAskedHost(FormMain.FileINI.GetIDIndex(grpSrcDest.m_strID), grpSrcDest.Clone_OnEvtDataAskedHost); } else { ; } break; } 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 - индекс типа группы источников (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> /// Передать в очередь обработки событий сообщение о необходимости установления/разрыва связи между группами источников /// </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> /// Получает сообщения от библиотеки из "другого" (источника) объекта /// </summary> /// <param name="obj"></param> public void Clone_OnEvtDataAskedHost(object obj) { EventArgsDataHost ev = obj as EventArgsDataHost; int iIDGroupSignals = 0; //??? д.б. указана в "запросе" //pars[0] - идентификатор события //pars[1] - идентификатор группы сигналов //pars[2] - таблица с данными для "вставки" //??? pars[3] - object [] с доп./параметрами, для ретрансляции object[] pars = ev.par as object[]; object[] parsToSend = null; //Logging.Logg().Debug(string.Format(@"GroupSourcesDest::Clone_OnEvtDataAskedHost (ev.par.Length={0}) - NAME={1}...", pars.Length, m_strShrName), Logging.INDEX_MESSAGE.NOT_SET); //pars[0] - идентификатор события switch ((ID_DATA_ASKED_HOST)pars[0]) { case ID_DATA_ASKED_HOST.INIT_SOURCE: //Получен запрос на парметры инициализации break; case ID_DATA_ASKED_HOST.INIT_SIGNALS: //Получен запрос на обрабатываемую группу сигналов break; case ID_DATA_ASKED_HOST.TABLE_RES: parsToSend = new object[pars.Length - 1]; //Проверить таблицу со значениями от библиотеки на 'null' if ((!(pars[2] == null)) && ((pars[2] as DataTable).Rows.Count > 0)) { //Заполнить для передачи основные параметры - таблицу parsToSend[1] = (pars[2] as DataTable).Copy(); //Проверить наличие дополнительных параметров //??? 07.12.2015 лишнее 'Dest' не обрабатывает - см. TO_START if ((parsToSend.Length > 2) && (pars.Length > 3) && (!(pars[3] == null))) { parsToSend[2] = new object[(pars[3] as object[]).Length]; //Заполнить для передачи дополнительные параметры - массив объектов ////Вариант №1 //for (int i = 0; i < (parsToSend[2] as object []).Length; i ++) // (parsToSend[2] as object [])[i] = (pars[3] as object[])[i]; //Вариант №2 (pars[3] as object[]).CopyTo(parsToSend[2] as object[], 0); } else { ; } //Установить взаимосвязь между полученными значениями группы сигналов и группой сигналов назначения foreach (GroupSignalsDest grpSgnls in m_listGroupSignals) { if (!(grpSgnls.GetListNeededIndexGroupSignals().IndexOf((int)pars[1]) < 0)) //Да, группа сигналов 'grpSgnls' ожидает значения от группы сигналов '(int)pars[1]' { parsToSend[0] = FormMain.FileINI.GetIDIndex(grpSgnls.m_strID); PerformDataAskedHostPlugIn(new EventArgsDataHost(m_iIdTypePlugInObjectLoaded, (int)ID_DATA_ASKED_HOST.TO_INSERT, parsToSend)); //Logging.Logg().Debug(@"GroupSources::Clone_OnEvtDataAskedHost () - NAME=" + m_strShrName + @", от [ID=" + (int)pars[1] + @"] для [ID=" + parsToSend[0] + @"] ...", Logging.INDEX_MESSAGE.NOT_SET); } else { ; } } } else { ; // таблица со значениями от библиотеки = null } break; //case ID_DATA_ASKED_HOST.START: // parsToSend = new object[(pars[3] as object[]).Length + 1]; // '+1' для идентификатора группы сигналов // //Установить взаимосвязь между полученными значениями группы сигналов и группой сигналов назначения // foreach (GroupSignalsDest grpSgnls in m_listGroupSignals) // if (!(grpSgnls.GetListNeededIndexGroupSignals().IndexOf((int)pars[1]) < 0)) // {//Да, группа сигналов 'grpSgnls' ожидает значения от группы сигналов '(int)pars[1]' // parsToSend [0] = FormMain.FileINI.GetIDIndex(grpSgnls.m_strID); // parsToSend[1] = (MODE_WORK)(pars[3] as object[])[0]; //MODE_WORK // parsToSend[2] = (int)(pars[3] as object[])[1]; //IdSourceConnSett // parsToSend[3] = (int)(pars[3] as object[])[2]; //ID_TEC // PerformDataAskedHostPlugIn(new EventArgsDataHost((int)ID_DATA_ASKED_HOST.TO_START, parsToSend)); // //Logging.Logg().Debug(@"GroupSources::Clone_OnEvtDataAskedHost () - NAME=" + m_strShrName + @", от [ID=" + (int)pars[1] + @"] для [ID=" + parsToSend[0] + @"] ...", Logging.INDEX_MESSAGE.NOT_SET); // } // else // ; // break; case ID_DATA_ASKED_HOST.STOP: parsToSend = new object[1]; //Установить взаимосвязь между полученными значениями группы сигналов и группой сигналов назначения foreach (GroupSignalsDest grpSgnls in m_listGroupSignals) { if ((!(grpSgnls.GetListNeededIndexGroupSignals().IndexOf((int)pars[1]) < 0)) && (grpSgnls.State == STATE.STARTED)) { parsToSend[0] = FormMain.FileINI.GetIDIndex(grpSgnls.m_strID); //Да, группа сигналов 'grpSgnls' ожидает значения от группы сигналов '(int)pars[1]'; PerformDataAskedHostPlugIn(new EventArgsDataHost(m_iIdTypePlugInObjectLoaded, (int)ID_DATA_ASKED_HOST.TO_STOP, parsToSend)); } else { ; } } break; case ID_DATA_ASKED_HOST.ERROR: iIDGroupSignals = (int)pars[1]; break; default: break; } }
//private void onClickMenuItem(object obj, EventArgs ev) //{ // EventPlugInMenuItemClick(obj, new PlugInMenuItem.PlugInMenuItemEventArgs(-1)); //} /// <summary> /// Обработчик события выбора (отобразить/закрыть вкладку) п. меню /// </summary> /// <param name="obj">Объект загруженной библиотеки вкладки</param> private void postOnClickMenuItem(EventArgsDataHost ev) { int idPlugIn = (int)ev.id_main , idFPanel = (int)ev.id_detail; PlugInMenuItem plugIn = s_plugIns[idPlugIn] as PlugInMenuItem; bool bMenuItemChecked = ((ToolStripMenuItem)ev.par[0]).Checked = !((ToolStripMenuItem)ev.par[0]).Checked; bool bTabRemoved = false; if (bMenuItemChecked == true) { //Отобразить вкладку //m_TabCtrl.AddTabPage(plugIn.GetNameMenuItem(idFPanel), idFPanel, HTabCtrlEx.TYPE_TAB.FIXED); //m_TabCtrl.TabPages[m_TabCtrl.TabCount - 1].Controls.Add((Control)plugIn.GetObject(idFPanel)); m_TabCtrl.AddTabPage((Control)plugIn.GetObject(idFPanel), plugIn.GetNameMenuItem(idFPanel), idFPanel, ASUTP.Control.HTabCtrlEx.TYPE_TAB.FIXED); } else { //Закрыть вкладку bTabRemoved = m_TabCtrl.RemoveTabPage(m_TabCtrl.IndexOfID(idFPanel)); //plugIn.GetNameMenuItem(idFPanel) if (bTabRemoved == false) { Logging.Logg().Warning(@"FormMain::postOnClickMenuItem (idFPanel = " + idFPanel + @") - вкладка не была закрыта...", Logging.INDEX_MESSAGE.NOT_SET); } else { ; } } if (m_iAutoActionTabs > 0) { m_iAutoActionTabs--; } else { ; } if (m_iAutoActionTabs == 0) {// закончился процесс автоматической загрузки (создания/добавления) вкладок if ((профайлАвтоЗагрузитьСохранитьToolStripMenuItem as ToolStripMenuItem).Checked == true) { saveProfile(); } else { ; } if ((m_TabCtrl.PrevSelectedIndex < 0) && (bMenuItemChecked == true)) {// только, если перед действием не была добавлена ни одна вкладка m_TabCtrl.PrevSelectedIndex = 0; } else { ; } } 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;
/// <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 () - ..."); } } }