Лабораторная работа 1 - Разработка нового распределенного приложения для инструментария Alchemi

 

Метод, в котором производится обработка грид-потоков на локальной машине


 

public partial class MainForm : Form

{

    ...

 

    /// <summary>

    /// Вычисляет график комплексной функции на локальной машине.

    /// </summary>

    void BuildGraphLocal()

    {

        // Устанавливаем диапазоны аргументов

        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);

 

        // Отображаем изображение графика на элементе управления PictureBox

        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;

 

        // Обновляем текущее и максимальное значение полосы прогресса

        progressBarBuildGraph.Value = 0;

        progressBarBuildGraph.Maximum = hor * ver;

 

        // Сохраняем время начала вычислений

        startTime = DateTime.Now;

 

        // Формируем грид-потоки и исполняем их на локальной машине

        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);

                // Запускаем грид-поток на выполнение

                thread.Start();

 

                // Обновляем прогресс вычислений

                UpdateProgress(thread);

            }

        }

    }

 

    ...

}