private object lineCmdLock; // объект для синхронизации выполнения команд над линиями связи /// <summary> /// Конструктор /// </summary> public Manager() { kpTypes = new Dictionary <string, Type>(); commLines = new List <CommLine>(); commandReader = null; infoThread = null; infoFileName = ""; startThread = null; startDT = DateTime.MinValue; linesStarted = false; lineCaptions = null; lineCmdLock = new object(); AppDirs = new AppDirs(); Settings = new Settings(); ServerComm = null; AppLog = new Log(Log.Formats.Full) { Encoding = Encoding.UTF8 }; AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; }
/// <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(); } }
private Thread startThread; // поток повторения попыток запуска #endregion Fields #region Constructors /// <summary> /// Конструктор /// </summary> public Manager() { kpTypes = new Dictionary<string, Type>(); commLines = new List<CommLine>(); commandReader = null; infoThread = null; infoFileName = ""; startThread = null; startDT = DateTime.MinValue; linesStarted = false; lineCaptions = null; lineCmdLock = new object(); AppDirs = new AppDirs(); Settings = new Settings(); ServerComm = null; AppLog = new Log(Log.Formats.Full) { Encoding = Encoding.UTF8 }; AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; }
/// <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> /// Конструктор /// </summary> public Manager() { commonParams.SetToDefault(); commLines = new List<CommLine>(); kpTypes = new SortedList<string, Type>(); commandReader = null; infoFileName = ""; infoTimer = new Timer(InfoTimerCallback, null, Timeout.Infinite, Timeout.Infinite); startTimer = null; startDT = DateTime.Now; linesStarted = false; maxLineCapLen = -1; lineLock = new object(); lineCmdLock = new object(); infoLock = new object(); ServerComm = null; Log = new Log(Log.Formats.Full); Log.Encoding = Encoding.UTF8; }