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