Скачать 347.51 Kb.
|
heightAnimation.To = dataSizeY; heightAnimation.Duration = TimeSpan.FromSeconds(1); MainWindow.Vault.vault[position].myEllipse.BeginAnimation(Ellipse.HeightProperty, heightAnimation); } dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, speed); dispatcherTimer.Start(); } } public void dispatcherTimer_Tick(object sender, EventArgs e) { counter += speed; // Раздача заданий while (commands.Count != 0 && (Convert.ToInt64(commands.Peek()[0]) / visualisationSpeed) < counter) { string[] currentCommand = commands.Dequeue(); string commandType = currentCommand[1]; Ellipse myEllipse; SolidColorBrush mySolidColorBrush; string prosessName; string dataName; int coreNumber; DoubleAnimation widthAnimation; DoubleAnimation heightAnimation; switch (commandType) { case "ps": prosessName = currentCommand[2]; coreNumber = Convert.ToInt32(currentCommand[3]); Processes Prosess = new Processes(); myEllipse = new Ellipse(); mySolidColorBrush = new SolidColorBrush(); mySolidColorBrush.Color = prosessColors.Pop(); myEllipse.Fill = mySolidColorBrush; myEllipse.StrokeThickness = 2; myEllipse.Stroke = Brushes.Black; myEllipse.Width = 1; myEllipse.Height = 1; Base.Children.Add(myEllipse); Canvas.SetLeft(myEllipse, center_x - 11 + (100 + 50 * coreNumber)); Canvas.SetTop(myEllipse, center_y - 11); widthAnimation = new DoubleAnimation(); widthAnimation.To = processesSizeX; widthAnimation.Duration = TimeSpan.FromSeconds(1); myEllipse.BeginAnimation(Ellipse.WidthProperty, widthAnimation); heightAnimation = new DoubleAnimation(); heightAnimation.To = processesSizeY; heightAnimation.Duration = TimeSpan.FromSeconds(1); myEllipse.BeginAnimation(Ellipse.HeightProperty, heightAnimation); Prosess.Name = prosessName; Prosess.myEllipse = myEllipse; Prosess.Orbits.setCenter(Canvas.GetLeft(myEllipse), Canvas.GetTop(myEllipse)); Prosess.Text = new Label(); Prosess.Text.Content = Prosess.Name; Prosess.Text.FontSize = 15; Base.Children.Add(Prosess.Text); Canvas.SetLeft(Prosess.Text, Prosess.Orbits.getTextX()); Canvas.SetTop(Prosess.Text, Prosess.Orbits.getTextY()); Canvas.SetZIndex(Prosess.Text, 100); Cores[coreNumber] = Prosess; break; case "pt": prosessName = currentCommand[2]; for (int i = 0; i < Cores.Length; i++) { if (Cores[i] != null && Cores[i].Name == prosessName) { for (int j = 0; j < Cores[i].Orbits.orbits.Length; j++) { for (int k = 0; k < Cores[i].Orbits.orbits[j].Length; k++) { if (Cores[i].Orbits.orbits[j][k] != null) { Base.Children.Remove(Cores[i].Orbits.orbits[j][k].myEllipse); } } } Base.Children.Remove(Cores[i].Text); Base.Children.Remove(Cores[i].myEllipse); Cores[i] = null; } } break; case "pr": prosessName = currentCommand[2]; dataName = currentCommand[3]; for (int i = 0; i < Cores.Length; i++) { if (Cores[i] != null && Cores[i].Name == prosessName) { FlyingData dataFly = new FlyingData(); dataFly.coreNumber = i; dataFly.op = Cores[i].Orbits.Add(); dataFly.pause = 0; dataFly.destination = "orbit"; Data getData = Vault.get(dataName); dataFly.data = new Data(); dataFly.data.Name = getData.Name; myEllipse = new Ellipse(); mySolidColorBrush = new SolidColorBrush(); mySolidColorBrush.Color = Colors.White; myEllipse.Fill = mySolidColorBrush; myEllipse.StrokeThickness = 1.5; myEllipse.Stroke = Cores[i].myEllipse.Fill; myEllipse.Width = dataSizeX; myEllipse.Height = dataSizeY; Base.Children.Add(myEllipse); Canvas.SetLeft(myEllipse, Canvas.GetLeft(getData.myEllipse)); Canvas.SetTop(myEllipse, Canvas.GetTop(getData.myEllipse)); dataFly.data.myEllipse = myEllipse; flyingData.Add(dataFly); break; } } break; case "pw": prosessName = currentCommand[2]; dataName = currentCommand[3]; for (int i = 0; i < Cores.Length; i++) { if (Cores[i] != null && Cores[i].Name == prosessName) { FlyingData dataFly = new FlyingData(); dataFly.vaultPosition = (int)Vault.Add(); dataFly.pause = 0; dataFly.destination = "vault"; dataFly.data = new Data(); dataFly.data.Name = dataName; myEllipse = new Ellipse(); myEllipse.Fill = Cores[i].myEllipse.Fill; myEllipse.StrokeThickness = 1.5; myEllipse.Stroke = Brushes.Black; myEllipse.Width = dataSizeX; myEllipse.Height = dataSizeY; Base.Children.Add(myEllipse); Canvas.SetLeft(myEllipse, Cores[i].Orbits.center_x + (processesSizeX - 1) / 2); Canvas.SetTop(myEllipse, Cores[i].Orbits.center_y + (processesSizeY - 1) / 2); dataFly.data.myEllipse = myEllipse; flyingData.Add(dataFly); } } break; case "da": dataName = currentCommand[2]; myEllipse = new Ellipse(); mySolidColorBrush = new SolidColorBrush(); mySolidColorBrush.Color = Colors.White; myEllipse.Fill = mySolidColorBrush; myEllipse.StrokeThickness = 1.5; myEllipse.Stroke = Brushes.Black; myEllipse.Width = 1; myEllipse.Height = 1; Data myEllipseData = new Data(); myEllipseData.Name = dataName; myEllipseData.myEllipse = myEllipse; int position = (int)Vault.Add(myEllipseData); Base.Children.Add(Vault.vault[position].myEllipse); Canvas.SetLeft(Vault.vault[position].myEllipse, getX(Vault.getX(position))); Canvas.SetTop(Vault.vault[position].myEllipse, getY(Vault.getY(position))); widthAnimation = new DoubleAnimation(); widthAnimation.To = dataSizeX; widthAnimation.Duration = TimeSpan.FromSeconds(1); MainWindow.Vault.vault[position].myEllipse.BeginAnimation(Ellipse.WidthProperty, widthAnimation); heightAnimation = new DoubleAnimation(); heightAnimation.To = dataSizeY; heightAnimation.Duration = TimeSpan.FromSeconds(1); MainWindow.Vault.vault[position].myEllipse.BeginAnimation(Ellipse.HeightProperty, heightAnimation); break; case "dd": dataName = currentCommand[2]; Base.Children.Remove(Vault.get(dataName).myEllipse); Vault.delete(dataName); break; } } for (int i = 0; i < Cores.Length; i++) { if (Cores[i] != null) { alfa[i] = (alfa[i] + alfaV[i]) % (2 * Math.PI); Canvas.SetLeft(Cores[i].myEllipse, center_x - 11 + (100 + 50 * i) * Math.Cos(alfa[i])); Canvas.SetTop(Cores[i].myEllipse, center_y - 11 + (100 + 50 * i) * Math.Sin(alfa[i])); Cores[i].Orbits.setCenter(Canvas.GetLeft(Cores[i].myEllipse), Canvas.GetTop(Cores[i].myEllipse)); Canvas.SetLeft(Cores[i].Text, Cores[i].Orbits.getTextX()); Canvas.SetTop(Cores[i].Text, Cores[i].Orbits.getTextY()); for (int j = 0; j < Cores[i].Orbits.orbits.Length; j++) { for (int k = 0; k < Cores[i].Orbits.orbits[j].Length; k++) { if (Cores[i].Orbits.orbits[j][k] != null) { Canvas.SetLeft(Cores[i].Orbits.orbits[j][k].myEllipse, Cores[i].Orbits.getX(new orbitPosition(j, k))); Canvas.SetTop(Cores[i].Orbits.orbits[j][k].myEllipse, Cores[i].Orbits.getY(new orbitPosition(j, k))); if ((counter - Cores[i].Orbits.addTimes[j][k]) > interval) { Base.Children.Remove(Cores[i].Orbits.orbits[j][k].myEllipse); Cores[i].Orbits.addTimes[j][k] = 0; Cores[i].Orbits.availableOrbits[j][k] = true; Cores[i].Orbits.orbits[j][k] = null; } } } } } } for (int i = 0; i < flyingData.Count; i++) { double direction_x; double direction_y; double length; switch (flyingData[i].destination) { case "orbit": direction_x = Cores[flyingData[i].coreNumber].Orbits.getX(flyingData[i].op) - Canvas.GetLeft(flyingData[i].data.myEllipse); direction_y = Cores[flyingData[i].coreNumber].Orbits.getY(flyingData[i].op) - Canvas.GetTop(flyingData[i].data.myEllipse); length = Math.Sqrt(direction_x * direction_x + direction_y * direction_y); if (flyingData[i].pause < 100) { flyingData[i].pause++; } else { if (length < 1) { Cores[flyingData[i].coreNumber].Orbits.orbits[flyingData[i].op.orbit][flyingData[i].op.position] = flyingData[i].data; Cores[flyingData[i].coreNumber].Orbits.addTimes[flyingData[i].op.orbit][flyingData[i].op.position] = counter; flyingData.RemoveAt(i); } else { Canvas.SetLeft(flyingData[i].data.myEllipse, Canvas.GetLeft(flyingData[i].data.myEllipse) + 2 * direction_x / length); Canvas.SetTop(flyingData[i].data.myEllipse, Canvas.GetTop(flyingData[i].data.myEllipse) + 2 * direction_y / length); } } break; case "vault": direction_x = getX(Vault.getX(flyingData[i].vaultPosition)) - Canvas.GetLeft(flyingData[i].data.myEllipse); direction_y = getY(Vault.getY(flyingData[i].vaultPosition)) - Canvas.GetTop(flyingData[i].data.myEllipse); length = Math.Sqrt(direction_x * direction_x + direction_y * direction_y); if (length < 1) { Canvas.SetLeft(flyingData[i].data.myEllipse, getX(Vault.getX(flyingData[i].vaultPosition))); Canvas.SetTop(flyingData[i].data.myEllipse, getY(Vault.getY(flyingData[i].vaultPosition))); Vault.vault[flyingData[i].vaultPosition] = flyingData[i].data; flyingData.RemoveAt(i); } else { Canvas.SetLeft(flyingData[i].data.myEllipse, Canvas.GetLeft(flyingData[i].data.myEllipse) + 2 * direction_x / length); Canvas.SetTop(flyingData[i].data.myEllipse, Canvas.GetTop(flyingData[i].data.myEllipse) + 2 * direction_y / length); } break; } } } } } Код программы специфичен для программирования визуализации с помощью технологии WPF. Мы не будем подробно его разбирать, однако отметим некоторые моменты. Система координат связана с центром экрана, движения объектов по окружностям просчитываются в полярных координатах. С каждым типом объектов связан отдельный класс, описывающий структуру объекта. При нажатии на кнопку “Старт” запускается обработчик события, который считывает и разбирает входной файл с историей работы программы, рассчитывает все необходимые параметры (в частности размер хранилища и начальное его состояние, формирует очередь команд для отображения работы программы), и запускает визуализацию. Визуализация строится на основе таймера. Каждые 10 миллисекунд запускается функция, которая пересчитывает расположение объектов, а так же проверяет, пришло ли время для запуска очередной команды из файла с историей, и если текущее время выполнения программы превышает время, указанное в команде, то команда выполняется и удаляется из очереди команд. Заключение В результате проведенной работы была разработана программа-визуализатор RideVis, которую можно использовать для представления работы параллельных программ, написанных для системы RiDE. В качестве сущностей визуализации выступают хранилище, данные, процессы, количество процессоров в системе. В качестве событий, на которых основывается визуализация, выступают добавление/удаление данных в хранилище, запуск/завершение процессов, чтение/запись данных в хранилище. По количеству отображаемых вокруг процессов прочитанных данных, а так же по состоянию хранилища, можно сделать первые выводы об эффективности работы программ, написанных для системы RiDE, потому как оценка эффективности является одной из основных задач. На данный момент система RiDE активно развивается, многие заложенные в нее идеи и возможности еще не реализованы, поэтому пока что речь идет лишь о первой версии визуализатора, отображающего лишь базовые функции системы. Дальнейшее развитие системы визуализации может быть связано с реализацией некоторых отладочных функций, разработкой средств для статистического анализа эффективности работы программ для системы RiDE, а так же создание базового инструментария для визуального программирования. Литература |
Литература по психологии,классичес Альдебаран-крупнейшая электронная библиотека on-line- художественная, учебная и техническая литература и книги различных жанров:... | Литература чувашская литература Чувашский государственного университет имени И. Н. Ульянова по специальности русский язык и литература | ||
“ Литература + литература” Идея проведения данного урока взята из газеты “Литература” (приложение к газете “Первое сентября”,№13 за 1998 год, страница 1) | Программа по формированию навыков безопасного поведения на дорогах... Литература и история. Литература как искусство слова. Литература и другие виды искусства | ||
Программа по формированию навыков безопасного поведения на дорогах... Литература и история. Литература как искусство слова. Литература и другие виды искусства | Литература 1 Русская литература. Мультимедийная энциклопедия. 8-11... Математика. Учебное электронное издание. 5-11. Новые возможности для усвоения математики | ||
ЛИТЕРАТУРА К КУРСУ "ФИЛОСОФИЯ" ОСНОВНАЯ ЛИТЕРАТУРА и ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА | "Литература народов России" (Кабардино-черкесская литература) ... | ||
Тема урока. Основное содержание Введение. Судьба России в XX веке. Основные направления, темы и проблемы русской литературы XX века. Русская советская литература;... | Программа по формированию навыков безопасного поведения на дорогах... Литература и жизнь. Литература как искусство слова. Вымысел. Литература как учебный предмет | ||
Литература Тема: Человек и история в поэме А. С. Пушкина «Медный всадник» Учебно-методическое обеспечение: учебник 10 класс литература Коровина В. И. Литература. 10 класс, Москва Просвещение. 1часть. 2012... | Рабочая программа по литературе составлена на основе программы "Литература.... Литература. 5-11 класс" под ред. Г. И. Беленького. Реализуется в учебнике "Литература. 11 класс: Учебник для общеобразовательных... | ||
Список бесплатных электронных библиотек Альдебаран крупнейшая электронная библиотека on-line художественная, учебная и техническая литература и книги различных жанров: детективы,... | Родная литература Рабочая программа по литературе для 5 класса к учебнику «Родная литература» (Ана литература) 5 класс. Авторы: (Суюнчев А., Азаматова... | ||
Рабочая программа учебного предмета: «Литература» «Литература» под редакцией В. Я. Коровиной (Программы для общеобразовательных учреждений. Литература. 5-11 кл. Авторы: В. Я. Коровина,... | Рабочая программа педагога по курсу «Литература» Литература 5 – 11 классы/ под редакцией Г. И. Беленького. – 4-е изд., перереб. – М.: Мнемозина, 2009. – 110с и ориентирована на использование... |