Лабораторная работа 2 - Применение модели грид-потоков для внедрения в грид существующего приложения
Метод, в котором производится обработка грид-потоков на локальной машине
public partial class MainForm : Form
{
...
/// <summary>
/// Рендеринг изображения на локальном компьютере.
/// </summary>
private void RenderImageLocal()
{
// Проверяем, требуется ли инициализация локального приложения
if (!localInit)
{
// Создаем локальное приложение
localApplication = new LocalApplication();
// Добавляем обработчик успешно завершившихся грид-потоков
localApplication.ThreadFinish += new GThreadFinish(ThreadFinish);
// Добавляем обработчик неудачно завершившихся грид-потоков
localApplication.ThreadFailed += new GThreadFailed(ThreadFailed);
// Инициализация завершена
localInit = true;
}
// Устанавливаем число горизонтальных и вертикальных разбиений
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);
// Добавляем грид-поток к локальному приложению
localApplication.Threads.Add(thread);
}
}
// Обновляем текущее и максимальное значение полосы прогресса
progressBarRenderProgress.Value = 0;
progressBarRenderProgress.Maximum = hor * ver;
// Сохраняем время начала вычислений
startTime = DateTime.Now;
try
{
// Запускаем локальное приложение
localApplication.Start();
}
catch (Exception e)
{
// Выводим сообщение об ошибке
MessageBox.Show("Can not start local application: " + e.ToString());
}
}
...
}