Пример #1
0
        /// <summary>
        /// Вызывает синтез СМО. Результатом является набор графиков и отчетов, сохраненные в указанные папки.
        /// </summary>
        /// <param name="parameters">Параметры, задаваемые пользователем.</param>
        /// <param name="minQueuePlaceCount">Минимальное количество мест в очереди</param>
        /// <param name="maxQueuePlaceCount">Максимальное количество мест в очереди</param>
        public void MakeSynthesis()
        {
            ParametersContainer    parameters;
            QueuePlaceGradientData gradient;
            string graphsFolder;
            string reportsFolder;

            if (!CheckParametersValid(parameters = CallbackUi.GetDiagramParameters()) ||
                !CheckParametersValid(gradient = CallbackUi.GetQueuePlaceGradientData()))
            {
                return;
            }

            graphsFolder = CallbackUi.GetFolderPath("Выберите папку для сохранения графиков");

            if (graphsFolder == "")
            {
                CallbackUi.ShowWarning("Синтез СМО", "Графики не будут сохранены");
            }

            reportsFolder = CallbackUi.GetFolderPath("Выберите папку для сохранения отчетов", graphsFolder);

            if (graphsFolder == "" && reportsFolder == "")
            {
                CallbackUi.ShowWarning("Синтез СМО", "Отмена синтеза СМО");
                return;
            }

            List <TimeDiagram> diagrams = new List <TimeDiagram>(gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1);

            CallbackUi.LockInterface();

            //Меняем параметр "КМО".
            for (parameters.QueueCapacity = gradient.MinQueueCapacity; parameters.QueueCapacity <= gradient.MaxQueueCapacity; parameters.QueueCapacity++)
            {
                CallbackUi.ShowText($"Моделирование процесса: {parameters.QueueCapacity - gradient.MinQueueCapacity + 1} из {gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1}...");

                ProcessModeller modeller = new ProcessModeller(parameters);

                try
                {
                    diagrams.Add(modeller.CreateDiagram());
                }
                catch/* (Exception ex)*/
                {
                    CallbackUi.HideText();
                    CallbackUi.UnlockInterface();
                    CallbackUi.ShowError("Синтез СМО", "При моделировании процесса возникло исключение." /* + ex.Message*/);
                    return;
                }
            }

            CallbackUi.HideText();
            CallbackUi.UnlockInterface();

            try
            {
                if (graphsFolder != "")
                {
                    foreach (var metric in GetMetrics(parameters.ChannelCount, gradient.MaxQueueCapacity))
                    {
                        var graph = GraphicsFactory.CreateGraphByPoints(gradient.MinQueueCapacity, ReportTool.GetHeights(diagrams, metric), "Кол-во мест в очереди", metric.Name);
                        graph.ExportToBitmap(true, graphsFolder + "/" + graph.Title + ".png");
                    }

                    CallbackUi.StartExplorer(graphsFolder);
                }
            }
            catch
            {
                CallbackUi.ShowError("Синтез СМО", "Недостаточно прав для записи в " + graphsFolder);
            }

            try
            {
                if (reportsFolder != "")
                {
                    foreach (var diagram in diagrams)
                    {
                        CallbackUi.CreateTextFile(reportsFolder + "/Отчет для кол-ва мест " + diagram.QueueCapacity + ".txt", MakeReport(parameters, diagram));
                    }

                    if (reportsFolder != graphsFolder)
                    {
                        CallbackUi.StartExplorer(reportsFolder);
                    }
                }
            }
            catch
            {
                CallbackUi.ShowError("Синтез СМО", "Недостаточно прав для записи в " + reportsFolder);
            }
        }
Пример #2
0
        public void MakeGraphImprovement()
        {
            ParametersContainer    parameters;
            QueuePlaceGradientData gradient;

            if (!CheckParametersValid(parameters = CallbackUi.GetDiagramParameters()) ||
                !CheckParametersValid(gradient = CallbackUi.GetQueuePlaceGradientData()))
            {
                return;
            }

            var metrics = GetMetrics(parameters.ChannelCount, gradient.MaxQueueCapacity).ToArray();

            GraphImprovementParamsData improvementData = CallbackUi.GetGraphImprovementParams(metrics.Select(metric => metric.Name).ToArray());

            if (!CheckParametersValid(improvementData, metrics.Length))
            {
                return;
            }

            Metric usedMetric = metrics[improvementData.MetricIndex];

            InteractiveDiagram intDiag = GraphicsFactory.CreateInteractiveGraph(usedMetric.Name);

            double[] heightsSum = null;

            CallbackUi.LockInterface();

            for (int i = 0; i < improvementData.ExperimentCount; i++)
            {
                List <TimeDiagram> diagrams = new List <TimeDiagram>(gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1);

                for (parameters.QueueCapacity = gradient.MinQueueCapacity; parameters.QueueCapacity <= gradient.MaxQueueCapacity; parameters.QueueCapacity++)
                {
                    CallbackUi.ShowText($"Эксперимент { i + 1} из {improvementData.ExperimentCount}.\nМоделирование процесса: {parameters.QueueCapacity - gradient.MinQueueCapacity + 1} из {gradient.MaxQueueCapacity - gradient.MinQueueCapacity + 1}...");

                    ProcessModeller modeller = new ProcessModeller(parameters);
                    try
                    {
                        diagrams.Add(modeller.CreateDiagram());
                    }
                    catch
                    {
                        CallbackUi.HideText();
                        CallbackUi.UnlockInterface();
                        CallbackUi.ShowError("Улучшение графика", "При моделировании процесса возникло исключение." /* + ex.Message*/);
                    }
                }

                var heights = ReportTool.GetHeights(diagrams, usedMetric);

                if (heightsSum == null)
                {
                    heightsSum = heights.ToArray();
                }
                else
                {
                    heightsSum = heightsSum.Zip(heights, (a, b) => a + b).ToArray();
                }

                intDiag.BeginInteractiveLine(i);
                intDiag.AddPoints(heights, gradient.MinQueueCapacity);
                intDiag.AddLineMetadata($"Эксперимент { i + 1 }");
                intDiag.CompleteLine();
            }

            CallbackUi.HideText();
            CallbackUi.UnlockInterface();

            intDiag.BeginLine(1);
            intDiag.AddPoints(heightsSum.Select(height => height / improvementData.ExperimentCount), gradient.MinQueueCapacity);
            intDiag.AddLineMetadata($"Сумма { improvementData.ExperimentCount } графиков");
            intDiag.CompleteLine();

            intDiag.SetLayer(0);
            CallbackUi.InteractiveDiagram = intDiag;
            intDiag.ViewUpdated          += CallbackUi.InvalidateDiagramView;
            intDiag.GoToEnd();
        }
Пример #3
0
        /// <summary>
        /// Вызывает создание диаграммы по заданным значениям. Результатом является отображение диграммы на главной панели.
        /// </summary>
        /// <param name="parameters">Параметры диграммы, заданные пользователем</param>
        public void MakeDiagram()
        {
            ParametersContainer parameters = CallbackUi.GetDiagramParameters();

            if (!CheckParametersValid(parameters))
            {
                return;
            }

            TimeDiagram timeDiagram;

            bool useGraphics = true;

            var timeToCl = (int)parameters.TimeLimit * parameters.ThreadIntencity;

            int min;

            if (!parameters.HasTimeLimit)
            {
                min = parameters.ClientLimit;
            }
            else if (!parameters.HasClientLimit)
            {
                min = timeToCl;
            }
            else
            {
                min = Math.Min(timeToCl, parameters.ClientLimit);
            }

            if (min > 200)
            {
                useGraphics = CallbackUi.YesNoDialog("Предупреждение", string.Format(@"Временная диаграмма будет содержать около {0} линий.
Ее отрисовка может вызвать замедление работы компьютера.
Отрисовать диаграмму?
(анализ диаграммы возможен при любом выборе)", min));
            }

            ProcessModeller modeller = new ProcessModeller(parameters);

            InteractiveDiagram intDiag = null;

            try
            {
                timeDiagram = useGraphics ? modeller.CreateDiagram(GraphicsFactory, out intDiag) : modeller.CreateDiagram();
            }
            catch
            {
                CallbackUi.ShowError("Создать диаграмму", "При моделировании процесса возникло исключение." /* + ex.StackTrace*/);
                return;
            }

            CallbackUi.InteractiveDiagram = intDiag;

            analyzeText = MakeReport(parameters, timeDiagram);

            if (intDiag != null)
            {
                CallbackUi.HideText();
                intDiag.ViewUpdated += CallbackUi.InvalidateDiagramView;
                intDiag.GoToEnd();
            }
            else
            {
                CallbackUi.ShowText("Отображение диграммы отключено.\nДля ее анализа, используйте Действия - Анализ диаграммы.");
            }
        }