Лабораторная работа 1 - Разработка нового распределенного приложения для инструментария Alchemi
Метод, в котором производится обработка грид-потоков в вычислительной грид
public partial class MainForm : Form
{
...
/// <summary>
/// Вычисляет график комплексной функции в грид-сети.
/// </summary>
void BuildGraphGrid()
{
// Проверяем, требуется ли инициализация грид-приложения
if (!gridInit)
{
// Создаем диалог для ввода параметров соединения
GConnectionDialog connectionDialog = new GConnectionDialog();
// Отображаем диалог
if (connectionDialog.ShowDialog() == DialogResult.OK)
{
// Создаем новое грид-приложение многократного использования
gridApplication = new GApplication(true);
// Устанавливаем имя созданного грид-приложения
gridApplication.ApplicationName = "Complex Visual - Alchemi sample";
// Устанавлливаем соединение созданного грид-приложения
gridApplication.Connection = connectionDialog.Connection;
// Устанавливаем зависимости, необходимые для работы грид-потоков
gridApplication.Manifest.Add(new ModuleDependency(typeof(MathTools.Complex).Module));
gridApplication.Manifest.Add(new ModuleDependency(typeof(GridThread.ComplexThread).Module));
// Добавляем событие для обработки успешно завершившихся грид-потоков
gridApplication.ThreadFinish += new GThreadFinish(ThreadFinish);
// Добавляем событие для обработки неудачно завершившихся грид-потоков
gridApplication.ThreadFailed += new GThreadFailed(ThreadFailed);
// Инициализация завершена
gridInit = true;
}
}
// Устанавливаем диапазоны аргументов
double xmin = (double)spinnerXMin.Value;
double xmax = (double)spinnerXMax.Value;
double ymin = (double)spinnerYMin.Value;
double ymax = (double)spinnerYMax.Value;
// Устанавливаем насыщенность белого и черного цвета
double white = (double)spinnerWhiteSaturation.Value;
double black = (double)spinnerBlackSaturation.Value;
// Устанавливаем число горизонтальных и вертикальных разбиений
int hor = (int)spinnerHorCells.Value;
int ver = (int)spinnerVerCells.Value;
// Устанавливаем ширину и высоту изображения графика
int width = (int)spinnerWidth.Value;
int height = (int)spinnerHeight.Value;
// Создаем точечный рисунок для хранения этого изображения
image = new Bitmap(width, height);
pictureBoxGraph.Image = image;
// Формируем комплексную функцию на основе введенной строки
BaseFunction funct = Parser.ParseString(textBoxFunction.Text);
// Проверяем, удалось ли сформировать функцию
if (funct == null)
{
// Выводим сообщение об ошибке
MessageBox.Show("It is not possible to distinguish function. Check up input.");
// Выходим из процедуры
return;
}
// Вычисляем ширину и высоту частей (ячеек), на которые делится изображение графика
int cellwidth = width / hor;
int cellheight = height / ver;
// Вычисляем изменения аргументов в ячейках
double xstep = (xmax - xmin) / hor;
double ystep = (ymax - ymin) / ver;
// Формируем грид-потоки для обрабоки отдельных частей графика
for (int hornumber = 0; hornumber < hor; hornumber++)
{
for (int vernumber = 0; vernumber < ver; vernumber++)
{
// Создаем новый грид-поток
ComplexThread thread = new ComplexThread(cellwidth, cellheight,
hornumber, vernumber,
xmin + xstep * hornumber,
xmin + xstep * (hornumber + 1),
ymax - ystep * (vernumber + 1),
ymax - ystep * vernumber,
funct, white, black);
// Добавляем созданный грид-поток к грид-приложению
gridApplication.Threads.Add(thread);
}
}
// Проверяем, работает ли грид-приложение
if (gridApplication.Running)
{
try
{
// Останавливаем грид-приложение
gridApplication.Stop();
}
catch (Exception e)
{
// Выводим сообщение об ошибке
MessageBox.Show("Error trying to stop already running grid application: " + e.ToString());
// Выходим из процедуры
return;
}
}
// Обновляем текущее и максимальное значение прогресса
progressBarBuildGraph.Value = 0;
progressBarBuildGraph.Maximum = hor * ver;
// Сохраняем время начала вычислений
startTime = DateTime.Now;
try
{
// Запускаем грид-приложение
gridApplication.Start();
}
catch (Exception e)
{
// Выводим сообщение об ошибке
MessageBox.Show("Error trying to run grid application: " + e.ToString());
}
}
...
}