Лабораторная работа 2 - Применение модели грид-потоков для внедрения в грид существующего приложения
Метод, в котором производится обработка грид-потоков в вычислительной грид
public partial class MainForm : Form
{
...
/// <summary>
/// Рендеринг изображения в вычислительной грид.
/// </summary>
private void RenderImageGrid()
{
// Проверяем, требуется ли инициализация грид-приложения
if (!gridInit)
{
// Создаем диалог подключения к грид
GConnectionDialog connectionDialog = new GConnectionDialog();
// Отображаем диалог подключения к грид
if (connectionDialog.ShowDialog() == DialogResult.OK)
{
// Создаем новое грид-приложение многократного использования
gridApplication = new GApplication(true);
// Устанавливаем имя созданного грид-приложения
gridApplication.ApplicationName = "Distributed MegaPOV - Alchemi sample";
// Устанавлливаем соединение созданного грид-приложения
gridApplication.Connection = connectionDialog.Connection;
}
// Добавляем зависимости, необходимые для запуска грид-потоков
gridApplication.Manifest.Add(new ModuleDependency(typeof(GridThread.RenderThread).Module));
// Добавляем событие для обработки успешно завершившихся грид-потоков
gridApplication.ThreadFinish += new GThreadFinish(ThreadFinish);
// Добавляем событие для обработки неудачно завершившихся грид-потоков
gridApplication.ThreadFailed += new GThreadFailed(ThreadFailed);
// Инициализация грид-приложения завершена
gridInit = true;
}
// Проверяем, работает ли грид-приложение
if (gridApplication.Running)
{
try
{
// Останавливаем работающее грид-приложение
gridApplication.Stop();
}
catch (Exception e)
{
// Выводим сообщение об ошибке
MessageBox.Show("Can not stop already running grid application: " + e.ToString());
// Выходим из метода
return;
}
}
// Устанавливаем число горизонтальных и вертикальных разбиений
int hor = (int)spinnerHorCells.Value;
int ver = (int)spinnerVerCells.Value;
// Устанавливаем ширину и высоту изображения в пикселях
int imagewidth = (int)spinnerWidth.Value;
int imageheight = (int)spinnerHeight.Value;
// Вычисляем ширину и высоту ячеек изображения в пикселях
int cellwidth = imagewidth / hor;
int cellheight = imageheight / ver;
// Создаем точечный рисунок для хранения изображения
image = new Bitmap(imagewidth, imageheight);
// Отображаем точечный рисунок на графическом элементе PictureBox
pictureBoxImage.Image = image;
// Устанавливаем настройки сглаживания изображения
AntialisingLevel antialiasLevel = (AntialisingLevel)comboBoxAntialias.SelectedIndex;
// Проверяем, загружен ли файл сцены
if (inputScene == null)
{
// Выводим сообщение об ошибке
MessageBox.Show("Please load scene file.");
// Выходим из метода
return;
}
// Формируем грид-потоки для обработки частей изображения
for (int hornumber = 0; hornumber < hor; hornumber++)
{
// Вычисляем координату левого столбца пикселей
int startcol = hornumber * cellwidth;
for (int vernumber = 0; vernumber < ver; vernumber++)
{
// Вычисляем кординату верхней строки пикселей
int startrow = vernumber * cellheight;
// Создаем грид-поток
RenderThread thread = new RenderThread(inputScene, tempDirectory, workDirectory,
imagewidth, imageheight, startrow, startcol,
startrow + cellheight, startcol + cellwidth,
antialiasLevel, additionalArguments);
// Добавляем грид-поток к грид-приложению
gridApplication.Threads.Add(thread);
}
}
// Обновляем текущее и максимальное значение полосы прогресса
progressBarRenderProgress.Value = 0;
progressBarRenderProgress.Maximum = hor * ver;
// Сохраняем время начала вычислений
startTime = DateTime.Now;
try
{
// Запускаем грид-приложение на выполнение
gridApplication.Start();
}
catch (Exception e)
{
// Выводим сообщение об ошибке
MessageBox.Show("Error trying to run grid application: " + e.ToString());
}
}
...
}