Лабораторная работа 2 - Применение модели грид-потоков для внедрения в грид существующего приложения

 

Основной метод void Start() класса грид-потока RenderThread

 


 

[Serializable]

public class RenderThread : GThread

{

    ...

 

    /// <summary>

    /// Основной метод грид-потока. Обрабатывает часть изображения.

    /// </summary>

    public override void Start()

    {

        // Сохраняем сцену для рендеринга во временном файле

        {

            try

            {

                // Создаем объект StreamWriter для записи текстового файла

                StreamWriter streamWriter = File.CreateText(FormatInput());

 

                // Сохраняем полученную сцену в файле

                streamWriter.Write(inputScene);

 

                // Закрываем объект StreamWriter и все связанные с ним ресурсы

                streamWriter.Close();

            }

            catch (Exception e)

            {

                // Сцену не удалось сохранить в файл

                throw new Exception("Error! Cannot write a scene to the file.", e);

            }

        }

 

        // Генерируем заданную часть изображения

        {

            // Создаем объект Process для управления локальными процессами

            Process process = new Process();

 

            // Задаем приложение MegaPOV для запуска

            process.StartInfo.FileName = Path.Combine(workDirectory, "bin/megapov");

 

            // Задаем аргументы приложения MegaPOV

            process.StartInfo.Arguments = FormatArguments();

 

            // Скрываем окно приложения MegaPOV

            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

 

            try

            {

                // Запускаем приложение MegaPOV

                process.Start();

 

                // Ожидаем завершения работы приложения MegaPOV

                process.WaitForExit();

 

                // Удаляем файл компьютерной сцены

                File.Delete(FormatInput());

            }

            catch (Exception e)

            {

                // Приложение MegaPOV не удалось корректно запустить

                throw new Exception("Error! Cannot start MegaPOV application.", e);

            }

        }

 

        // Получаем сгенерированное изображение из файла

        {

            try

            {

                // Загружаем изображение из файла

                Image output = Bitmap.FromFile(FormatOutput());

 

                // Создаем объект Graphics для работы с изображением

                Graphics graphics = Graphics.FromImage(image);

 

                // Вырезаем из загруженного изображения полезную часть

                graphics.DrawImage(output, 0, 0,

                                   new Rectangle(startCol, 0, endCol - startCol, endRow - startRow),

                                   GraphicsUnit.Pixel);

 

                // Освобождаем все ресурсы

                output.Dispose();

 

                // Удаляем графический файл

                File.Delete(FormatOutput());

            }

            catch (Exception e)

            {

                // Графический файл не удалось корректно обработать

                throw new Exception("Error! Cannot process output file.", e);

            }

        }

    }

 

    ...

}