Лабораторная работа 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());

        }

    }

 

    ...

}