private Thread thread; // поток приёма команд /// <summary> /// Конструктор /// </summary> public CommandReader(Manager mngr) { this.mngr = mngr; serverComm = mngr.ServerComm; cmdDir = Manager.CmdDir; log = mngr.Log; thread = null; }
private Thread thread; // поток приёма команд /// <summary> /// Конструктор /// </summary> public CommandReader(Manager mngr) { if (mngr == null) throw new ArgumentNullException("mngr"); this.mngr = mngr; serverComm = mngr.ServerComm; cmdDir = mngr.AppDirs.CmdDir; log = mngr.AppLog; thread = null; }
private Thread thread; // поток приёма команд /// <summary> /// Конструктор /// </summary> public CommandReader(Manager mngr) { if (mngr == null) { throw new ArgumentNullException("mngr"); } this.mngr = mngr; serverComm = mngr.ServerComm; cmdDir = mngr.AppDirs.CmdDir; log = mngr.AppLog; thread = null; }
/// <summary> /// Запустить потоки линий связи и поток обмена данными со SCADA-Сервером /// </summary> private bool StartThreads() { // остановка потоков StopThreads(); try { // приём необходимых таблиц базы конфигурации от SCADA-Сервера bool fatalError = false; DataTable tblInCnl; DataTable tblKP; if (Settings.Params.ServerUse) { ServerComm = new ServerCommEx(Settings.Params, AppLog); if (!ReceiveBaseTables(out tblInCnl, out tblKP)) { fatalError = true; AppLog.WriteAction(string.Format(Localization.UseRussian ? "Запуск работы невозможен из-за проблем взаимодействия со SCADA-Сервером.{0}{1}" : "Unable to start operation due to SCADA-Server communication error.{0}{1}", Environment.NewLine, CommPhrases.RetryDelay), Log.ActTypes.Error); ServerComm.Close(); ServerComm = null; } } else { tblInCnl = null; tblKP = null; } if (!fatalError) { // настройка линий связи по базе конфигурации if (Settings.Params.ServerUse) { foreach (CommLine commLine in commLines) { commLine.Tune(tblInCnl, tblKP); } } // запуск потоков линий связи AppLog.WriteAction(Localization.UseRussian ? "Запуск линий связи" : "Start communication lines", Log.ActTypes.Action); lock (commLines) { foreach (CommLine commLine in commLines) { commLine.ServerComm = ServerComm; commLine.Start(); } linesStarted = true; } // запуск приёма команд AppLog.WriteAction(Localization.UseRussian ? "Запуск приёма команд" : "Start receiving commands", Log.ActTypes.Action); commandReader = new CommandReader(this); commandReader.StartThread(); } // запуск потока записи информации о работе приложения if (linesStarted) { infoThread = new Thread(new ThreadStart(WriteInfoExecute)); infoThread.Start(); } return(linesStarted); } catch (Exception ex) { AppLog.WriteAction((Localization.UseRussian ? "Ошибка при запуске работы: " : "Error starting operation: ") + ex.Message, Log.ActTypes.Exception); return(false); } finally { if (infoThread == null) { WriteInfo(); } } }
/// <summary> /// Запустить потоки линий связи и поток обмена данными со SCADA-Сервером /// </summary> private bool StartThreads() { // остановка потоков StopThreads(); try { // приём необходимых таблиц базы конфигурации от SCADA-Сервера bool fatalError = false; DataTable tblInCnl; DataTable tblKP; if (Settings.Params.ServerUse) { ServerComm = new ServerCommEx(Settings.Params, AppLog); if (!ReceiveBaseTables(out tblInCnl, out tblKP)) { fatalError = true; AppLog.WriteAction(string.Format(Localization.UseRussian ? "Запуск работы невозможен из-за проблем взаимодействия со SCADA-Сервером.{0}{1}" : "Unable to start operation due to SCADA-Server communication error.{0}{1}", Environment.NewLine, CommPhrases.RetryDelay), Log.ActTypes.Error); ServerComm.Close(); ServerComm = null; } } else { tblInCnl = null; tblKP = null; } if (!fatalError) { // настройка линий связи по базе конфигурации if (Settings.Params.ServerUse) { foreach (CommLine commLine in commLines) commLine.Tune(tblInCnl, tblKP); } // запуск потоков линий связи AppLog.WriteAction(Localization.UseRussian ? "Запуск линий связи" : "Start communication lines", Log.ActTypes.Action); lock (commLines) { foreach (CommLine commLine in commLines) { commLine.ServerComm = ServerComm; commLine.Start(); } linesStarted = true; } // запуск приёма команд AppLog.WriteAction(Localization.UseRussian ? "Запуск приёма команд" : "Start receiving commands", Log.ActTypes.Action); commandReader = new CommandReader(this); commandReader.StartThread(); } // запуск потока записи информации о работе приложения if (linesStarted) { infoThread = new Thread(new ThreadStart(WriteInfoExecute)); infoThread.Start(); } return linesStarted; } catch (Exception ex) { AppLog.WriteAction((Localization.UseRussian ? "Ошибка при запуске работы: " : "Error starting operation: ") + ex.Message, Log.ActTypes.Exception); return false; } finally { if (infoThread == null) WriteInfo(); } }
/// <summary> /// Обработать срабатывание таймера для запуска потоков линий связи и потока обмена данными /// </summary> private void StartTimerCallback(Object state) { try { // остановка таймера startTimer.Change(Timeout.Infinite, Timeout.Infinite); // установка соединения со SCADA-Сервером и приём таблиц базы конфигурации bool serverUse = commonParams.ServerUse && commonParams.ServerHost != "" && commonParams.ServerPort > 0; bool serverOk; DataTable tblInCnl = null; DataTable tblKP = null; if (serverUse) { ServerComm = new ServerCommEx(commonParams, Log); serverOk = ReceiveBaseTables(out tblInCnl, out tblKP); } else { serverOk = false; } if (!serverUse || serverOk) { // настройка линий связи lock (lineLock) { if (serverUse) { foreach (CommLine commLine in commLines) TuneCommLine(commLine, tblInCnl, tblKP); } // запуск потоков линий связи и приёма команд Log.WriteAction(Localization.UseRussian ? "Запуск линий связи" : "Start communication lines", Log.ActTypes.Action); foreach (CommLine commLine in commLines) { commLine.ServerComm = ServerComm; commLine.StartThread(); } if (ServerComm != null || CmdDir != "") { Log.WriteAction(Localization.UseRussian ? "Запуск приёма команд" : "Start receiving commands", Log.ActTypes.Action); commandReader = new CommandReader(this); commandReader.StartThread(); } linesStarted = true; startTimer = null; } } else { Log.WriteAction(Localization.UseRussian ? "Запуск линий связи невозможен из-за проблем взаимодействия со SCADA-Сервером" : "Unable to start communication lines due to SCADA-Server communication error", Log.ActTypes.Error); // завершение работы со SCADA-Сервером if (ServerComm != null) { ServerComm.Close(); ServerComm = null; } startTimer.Change(StartAttemptSpan, Timeout.Infinite); } } catch (Exception ex) { Log.WriteAction((Localization.UseRussian ? "Ошибка при запуске: " : "Start error: ") + ex.Message, Log.ActTypes.Exception); } }
/// <summary> /// Остановить потоки линий связи и поток обмена данными со SCADA-Сервером /// </summary> public void StopThreads() { try { // прерывание потока приёма команд if (commandReader != null && commandReader.Thread != null) commandReader.Thread.Abort(); if (commLines.Count > 0) { Log.WriteAction(Localization.UseRussian ? "Остановка линий связи" : "Stop communication lines", Log.ActTypes.Action); linesStarted = false; // далее lock (lineLock) не требуется // выполнение команд завершения работы линий связи foreach (CommLine commLine in commLines) commLine.Terminate(); // ожидание завершения работы линий связи DateTime nowDT = DateTime.Now; DateTime t0 = nowDT; DateTime t1 = nowDT.AddMilliseconds(commonParams.WaitForStop); bool running; // есть линия связи, продолжающая работу do { running = false; foreach (CommLine commLine in commLines) { if (commLine.RunState != CommLine.RunStates.Terminated) { running = true; break; } } if (running) Thread.Sleep(200); nowDT = DateTime.Now; } while (t0 <= nowDT && nowDT <= t1 && running); // прерывание работы линий связи if (running) { foreach (CommLine commLine in commLines) if (commLine.AbortAllowed) commLine.Thread.Abort(); } } // завершение работы со SCADA-Сервером if (ServerComm != null) { ServerComm.Close(); ServerComm = null; } // пауза для повышения вероятности полной остановки потоков Thread.Sleep(500); // запись в файл информации о работе программы WriteInfo(); } catch (Exception ex) { Log.WriteAction((Localization.UseRussian ? "Ошибка при остановке линий связи: " : "Error stop communication lines: ") + ex.Message, Log.ActTypes.Exception); } }