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

        }

    }

 

    ...

}