Ejemplo n.º 1
0
        /// <summary>
        /// Остановить потоки линий связи и поток обмена данными со SCADA-Сервером
        /// </summary>
        private void StopThreads()
        {
            try
            {
                // остановка потока записи информации о работе приложения
                if (infoThread != null)
                {
                    infoThread.Abort();
                    infoThread = null;
                }

                // остановка потока приёма команд
                if (commandReader != null)
                {
                    commandReader.StopThread();
                }

                if (linesStarted)
                {
                    AppLog.WriteAction(Localization.UseRussian ?
                                       "Остановка линий связи" :
                                       "Stop communication lines", Log.ActTypes.Action);
                    linesStarted = false; // далее lock (commLines) не требуется

                    // выполнение команд завершения работы линий связи
                    foreach (CommLine commLine in commLines)
                    {
                        commLine.Terminate();
                    }

                    // ожидание завершения работы линий связи
                    DateTime nowDT = DateTime.Now;
                    DateTime t0    = nowDT;
                    DateTime t1    = nowDT.AddMilliseconds(Settings.Params.WaitForStop);
                    bool     running; // есть линия связи, продолжающая работу

                    do
                    {
                        running = false;
                        foreach (CommLine commLine in commLines)
                        {
                            if (!commLine.Terminated)
                            {
                                running = true;
                                Thread.Sleep(ScadaUtils.ThreadDelay);
                                break;
                            }
                        }
                        nowDT = DateTime.Now;
                    }while (t0 <= nowDT && nowDT <= t1 && running);

                    // прерывание работы линий связи
                    if (running)
                    {
                        foreach (CommLine commLine in commLines)
                        {
                            commLine.Abort();
                        }
                    }
                }

                // завершение работы со SCADA-Сервером
                if (ServerComm != null)
                {
                    ServerComm.Close();
                    ServerComm = null;
                }

                // пауза для повышения вероятности полной остановки потоков
                Thread.Sleep(ScadaUtils.ThreadDelay);

                // запись информации о работе программы
                workState = WorkStateNames.Stopped;
                WriteInfo();
            }
            catch (Exception ex)
            {
                AppLog.WriteAction((Localization.UseRussian ?
                                    "Ошибка при остановке линий связи: " :
                                    "Error stop communication lines: ") + ex.Message, Log.ActTypes.Exception);
            }
        }