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

        }

    }

 

    ...

}