/// <summary> /// Определить нове значение для состояния /// </summary> /// <param name="mode">Режим работы группы сигналов</param> /// <param name="prevState">Предыдущее значение состояния</param> /// <returns>Новое состояние</returns> public static STATE NewState(uLoaderCommon.MODE_WORK mode,STATE prevState) { GroupSignals.STATE stateRes = GroupSignals.STATE.UNKNOWN; //Проверить режим работы if (mode == uLoaderCommon.MODE_WORK.CUR_INTERVAL) { // для режима "текущий интервал" switch (prevState) { case STATE.ACTIVE: case STATE.UNKNOWN: stateRes = GroupSignals.STATE.TIMER; break; default: stateRes = GroupSignals.STATE.SLEEP; break; } } else if (mode == uLoaderCommon.MODE_WORK.COSTUMIZE) { // для режима "выборочно" stateRes = GroupSignals.STATE.SLEEP; } else if (mode == uLoaderCommon.MODE_WORK.ON_REQUEST) { // для режима "по требованию" stateRes = GroupSignals.STATE.SLEEP; } else { //??? throw new Exception ; } return(stateRes); }
/// <summary> /// Старт группы сигналов с указанным идентификаторм /// </summary> /// <param name="id">Идентификатор группы сигналов</param> public void Start(int id) { Logging.Logg().Debug(@"HHandlerDbULoader::Start (ID=" + (_iPlugin as PlugInBase)._Id + @", key=" + id + @") - ...",Logging.INDEX_MESSAGE.NOT_SET); int iNeedStarted = -1; //Признак необходимости запуска "родительского" объекта GroupSignals.STATE initState = GroupSignals.STATE.UNKNOWN; //Новое состояние группы сигналов при старте //Установить признак необходимости запуска "родительского" объекта try { iNeedStarted = IsStarted == false ? 1 : 0; } catch (Exception e) { Logging.Logg().Exception(e,Logging.INDEX_MESSAGE.NOT_SET,@"HHandlerDbULoader::Start (ID=" + (_iPlugin as PlugInBase)._Id + @", key=" + id + @") - ..."); } //Новое состояние в зависимости от режима группы сигналов switch (m_dictGroupSignals[id].Mode) { case MODE_WORK.CUR_INTERVAL: initState = GroupSignals.STATE.TIMER; break; case MODE_WORK.COSTUMIZE: case MODE_WORK.ON_REQUEST: // для состояния 'UNKNOWN' (для группы сигналов назначения) initState = GroupSignals.STATE.SLEEP; break; default: break; } //Изменить состояние lock (m_lockStateGroupSignals) { if ((!(m_dictGroupSignals == null)) && (m_dictGroupSignals.Keys.Contains(id) == true)) { m_dictGroupSignals[id].State = initState; } else { iNeedStarted = -1; } } Logging.Logg().Debug(@"HHandlerDbULoader::Start (ID=" + (_iPlugin as PlugInBase)._Id + @", key=" + id + @") - iNeedStarted=" + iNeedStarted + @" ...",Logging.INDEX_MESSAGE.NOT_SET); //Подтвердить клиенту изменение состояние (_iPlugin as PlugInBase).DataAskedHost(new object[] { ID_DATA_ASKED_HOST.START,id }); //Проврить признак необходимости запуска "родительского" объекта if (iNeedStarted == 1) { //Запустиь объект и все зависимые потоки Start(); //Активировать объект Activate(true); } else { ; } //Регистрация источника дфнных и установка с ним соединения lock (m_lockStateGroupSignals) { register(id,0,m_connSett,string.Empty); } }
/// <summary> /// Потоковая функция очереди обработки объектов с событиями /// </summary> private void fThreadQueue() { bool bRes = false; while (!(threadQueueIsWorking < 0)) { bRes = false; //Проверить наличие объектов для обработки lock (m_lockQueue) { bRes = QueueCount > 0; } if (bRes == false) { //Ожидать когда появятся объекты для обработки //bRes = m_semaQueue.WaitOne(); bRes = m_autoResetEvtQueue.WaitOne(); } else { ; //Начать обработку немедленно } while (true) { lock (m_lockQueue) { if (QueueCount == 0) { //Прервать, если обработаны все объекты break; } else { ; } } //Получить объект очереди событий m_IdGroupSignalsCurrent = m_queueIdGroupSignals.Peek(); State = GroupSignals.STATE.ACTIVE; //Logging.Logg().Debug(@"HHandlerDbULoader::fThreadQueue () - начало обработки группы событий очереди (ID_PLUGIN=" + (_iPlugin as PlugInBase)._Id + @", ID_GSGNLS=" + m_IdGroupSignalsCurrent + @")", Logging.INDEX_MESSAGE.NOT_SET); lock (m_lockState) { //Очистить все состояния ClearStates(); //Добавить все состояния addAllStates(); } //Обработать все состояния Run(@"HHandlerDbULoader::fThreadQueue ()"); //Ожидать обработки всех состояний m_waitHandleState[(int)INDEX_WAITHANDLE_REASON.SUCCESS].WaitOne(System.Threading.Timeout.Infinite); lock (m_lockQueue) { //Удалить объект очереди событий (обработанный) m_queueIdGroupSignals.Dequeue(); } GroupSignals.STATE newState = GroupSignals.NewState(Mode,State); lock (m_lockStateGroupSignals) { State = newState; } ((PlugInBase)_iPlugin).DataAskedHost(getDataAskedHost()); //Logging.Logg().Debug(@"HHandlerDbULoader::fThreadQueue () - окончание обработки группы событий очереди (ID_PLUGIN=" + (_iPlugin as PlugInBase)._Id + @", ID_GSGNLS=" + m_IdGroupSignalsCurrent + @")", Logging.INDEX_MESSAGE.NOT_SET); try { m_IdGroupSignalsCurrent = -1; } catch (Exception e) { Logging.Logg().Exception(e,Logging.INDEX_MESSAGE.NOT_SET,@"HHandlerDbULoader.fThreadQueue () - ..."); } } } //Освободить ресурс ядра ОС //??? "везде" 'true' if (bRes == true) { try { //m_semaQueue.Release(1); m_autoResetEvtQueue.Reset(); } catch (Exception e) { //System.Threading.SemaphoreFullException Logging.Logg().Exception(e,Logging.INDEX_MESSAGE.NOT_SET,"HHandlerDbULoader::fThreadQueue () - semaState.Release(1)"); } } else { ; } }