Растровая графика. CopyFromScreen – копирование заданной прямоугольной области экрана, контекст как растрового изображения

CopyFromScreen – копирование заданной прямоугольной области экрана, контекст как растрового изображения.

DrawIcon – строит изображения иконки в прямоугольной области.

DrawIconUnstretched – строит изображение иконки без масштабирования.

DrawImage – растровое изображение отстроится в заданной области контекста в требуемом масштабе.

Другая группа методов позволяет оперировать растровыми объектами и выполнять градиентную, текстурную, сплошную заливку областей.

При практической реализации графики необходимо учитывать, что событие Paint генерируется ОС, т.е. любые изменения изображений, сделанные в программе будут отображены после перерисовки окна. В некоторых библиотеках, например,.Net, запрещается вызывать обработчики событий из других обработчиков, чтобы повысить надежность.

Для быстрого отображения изменений используется метод Invalidate. Этот метод имеет любой графический элемент. Вызов метода означает отсылку сообщения ОС о том, что графический элемент требует перерисовать его. В ответ ОС генерирует событие Paint.

Порядок использования программного кода по отрисовке осуществляет наложение изображения друг на друга. Позже отрисованное изображение находится выше.

Для использования растровых изображений загружают из файла и сохраняют в переменных класса Image. Метод DrawImage принимает в качестве параметра имя переменной и координаты верхнего левого угла, из которого будет отрисовано растровое изображение.

Тема №12 «Вывод на принтер»

Для вывода графических изображений на принтер необходимо выполнить аналогичные действия выводу на любое графическое устройство:

1) Получить контекст для вывода на принтер

2) Построить графическое изображение исходя из фактических размеров контекста

3) Вызвать функцию отправки изображения на принтер

Данный элемент управления – PrintDocument в Visual Studio позволяет облегчить программирование процедуры печати. После перетаскивания на форму создается объект класса PrintDocument, метод PrintPage аналогичен методу Paint для графических устройств. В качестве параметров метода PrintPage передаются аргументы, аналогично методу Paint, второй аргумент (e-> graphics) в качестве свойства задает контекст печати. Через свойства контекста можно получить параметры страницы принтера, его разрешение.

Печать инициируется следующим образом: экземпляр объекта PrintDocument имеет метод Print. Вызов метода Print приводит к тому, что система печати вызывает метод PrintPage, именно в нем программа размещает команды графических построений. После завершения печати завершается метод PrintPage, при этом работа принтера и приложения осуществляется параллельно.

В процедуре печати присутствует механизм обратного вызова. Механизм заключается в том, что прикладная программа отправляя запрос на печать сообщает подсистеме печати имя своей функции, которую необходимо вызвать в момент формирования изображения. Такой механизм позволяет синхронизировать “медленные” процессы на печатающем устройстве и “быстрые” процессы в вычислительной системе. Прикладная программа не ожидает момента готовности печатающего устройства, а продолжает работу дальше. Обратный вызов функции запустит ее как параллельный поток в среде исполнения.Net.

Класс PrintPreviewDialog предназначен для предварительного просмотра изображений перед печатью. Эта функция является системной, т.е. учитывает свойства текущего принтера. Если принтер не установлен, то предварительный просмотр не имеет смысла.

Document=PrintDocument1

Свойство Document должно указывать на экземпляр класса PrintDocument. Это можно сделать либо в программном коде, либо на вкладке свойств самого документа.

PrintPreviewDialog->ShowDialog()

Метод ShowDialog() формирует окно предварительного просмотра.

Чтобы анимировать графические изображения используют таймеры ОС. Таймер это объект ядра, который создается по запросу прикладной программы. Запрос на создание таймера содержит временной интервал, тип таймера (одиночный или периодический) и функцию для обратного вызова. Получив запрос ОС создает таймер и следит за истечением интервала времени. Если интервал завершился, то ОС генерирует сообщение прикладной программе, вызывая ее функцию обработки события от таймера. В функции обратного вызова размещается программный код реагирования на завершение таймера.

В Visual Studio имеется компонент Timer, который инкапсулирует все детали организации использования таймера. Свойство Interval содержит длину интервал в миллисекундах, свойство Enabled является логическим, значение False запрещает работу таймера, значение True разрешает. Обработчик завершения таймера, называется Tick, в качестве значения принимает имя одной из функции программы. Именно эта функция будет вызываться по завершению таймера.

Функцию завершения используют не только для программирования анимации, но и для синхронного взаимодействия с любыми другими системами, например, по таймеру может осуществляться опрос внешних датчиков. Полученная информация может сохраняться в файлах или базе данных.

В библиотеке.Net есть специальный тип delegate, который определяет шаблон функции обратного вызова. При создании экземпляра delegate, в качестве параметра конструктору указывается функция или метод, которые будут использоваться для обратного вызова. Экземпляр delegate может отправляться любой внешней системе, чтобы реализовать взаимодействие с помощью обратного вызова.

Тема №13 «Технологии параллельного программирования»

Всякая программа может быть построена в последовательном либо параллельном стиле, а также в некотором промежуточном варианте. Параллельный стиль построения создает возможность эффективного выполнения программы в многопроцессорных системах (многоядерных процессорах). Суть в том, что отдельные участки программного кода могут исполняться независимо в параллельно работающих процессорах. Очевидный выигрыш во времени дополняется тем, что система в целом становится отказоустойчивой: отказ любого процессора позволяет перераспределять работающие процессоры и загружать их другими фрагментами программного кода.

Основные механизмы параллельного исполнения программного кода заложены в ОС. Многозадачные ОС отличаются тем, что обладают средствами распределения процессорного времени. Время распределяется между активными процессами, порожденными работающими программами.

Распределение процессорного времени между процессами осуществляется в режиме прерывания, т.е. любая последовательность команд может быть приостановлена и текущее состояние будет сохранено для последующего выхода из прерывания. Прерваться программа может в любом месте в рамках любой команды процессора. Поскольку высокоуровневые языки программирования за каждой операцией скрывают несколько процессорных команд можно считать, что прерывание может произойти при любой высокоуровневой операции, а также в других точках, которые скрыты от программиста. То, что программы могут непредсказуемо приостанавливаться может приводить к некорректным результатам обработки. Задачу согласования параллельно работающих программ называют задачей синхронизации.

В ОС Windows под процессом понимается объект контейнер, в котором существуют динамические объекты потоки. ОС Windows осуществляет распределение процессорного времени на уровне потоков, таким образом отдельно взятый процесс в совокупности может получать больше времени благодаря наличию большего числа потоков.

API Windows

CreateProcess(…)

CreateThread(…)

TerminateProcess(…)

TerminateThread(…)

Программы могут самостоятельно порождать новые процессы и потоки. В первом случае переменные созданного процесса недоступны из родительского, во втором случае подобная возможность имеется. Каждый процесс может быть завершен другим процессом. Аналогично можно завершить любой поток. Средства синхронизации различаются для случая процессов и потоков, что связано с границей адресного пространства.

Задачи синхронизации используют понятие критического ресурса. Это ресурс, пользоваться которым в любой момент времени может только один поток. Если доступ получают два потока или более фиксируется аварийная ситуация. Участки программного кода, использующие критический ресурс, называются критическими областями.

Решать задачу синхронизации с помощью переменных не эффективно по нескольким причинам:

1) Переменная внутри программ невозможно изменять и проверять в разных процессах. Нужны особые “переменные” доступные из разных процессов.

2) Обычные переменные учитывают количество потоков пользующихся критическим ресурсом. В реальных условиях число потоков меняется, что требует усложнять логику доступа в критическую область.

3) При использовании переменных имеет место спин-блокировка, т.е. активное ожидание изменения значения переменных. Это нерационально с системной точки зрения. Ожидающий поток должен переводиться в специальное состояние, когда ему не предоставляется процессорное время.

Эти факторы компенсируются применением специальных средств синхронизации.

Тема №14 «InterLocked – операции»

Основная идея InterLocked операций состоит в том, что некоторые элементарные операции языка высокого уровня реализуются как атомарные. Это значит, что такая операция выполняется от начала до конца и не может быть прервана диспетчером задач, следовательно соответствующие переменные перестают быть критическими.

С помощью InterLocked функций удается синхронизировать потоки для случаев, когда речь идет об общих переменных, которые изменяют значения. Пользоваться этими функциями желательно в первую очередь, поскольку при их выполнении не возникает внешних издержек, вызванных управлением. С другой стороны поскольку на время выполнения операций блокируются прерывания ослабляется эффект многозадачности.

Критические секции (мониторы)

Критические секции (мониторы) на программном уровне представляются специальной структурой данных (CRITICAL_SECTION). Эта структура носит системный характер, т.е. определяется на уровне API Windows. В набор системных функций Windows входят функции обеспечивающие вход в критическую секцию и выход из нее. Если поток вызывает функцию входа - EnterCriticalSection, то возможны 2 случая:

1) Если критическая секция свободна, система фиксирует ее занятость, а поток переходит к следующей команде программного кода. Обычно этот программный код является критической областью программы.

2) Если критическая секция занята, поток приостанавливается и ожидает освобождения критической секции. Критическая секция будет освобождена занявшим ее потоком через вызов функции «покинуть критическую секцию» LeaveCriticalSection. Если несколько потоков ожидают освобождения критической секции, они выстраиваются в очередь, из которой будет выбран один поток по установленным в системе принципам. При программировании не допускается делать предположения о порядке выбора из очереди.

Критические секции применяются для синхронизации потоков внутри процесса. Причина в том, что критическая секция это общая переменная.

Ожидание потоков может строиться двумя способами:

1) Спин – блокировка

2) Переход в режим ядра

В первом случае ожидаемый поток потребляет процессорное время, во втором случае диспетчер ОС Windows время потоку не выделяет. Данное состояние “полезнее” с системной точки зрения, однако, требует заметных затрат для перехода и возврата из состояния ядра. Ожидание входа в критическую секцию реализуется как комбинация двух способов, т.е. в начале спин-блокировка и по завершению таймаута переход в режим ядра.

WaitForSingleObject(…) – ожидать один объект

WaitForMultiplObject (…) – ожидать несколько объектов


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: