Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Новгородский государственный университет имени Ярослава Мудрого»
Старорусский политехнический колледж
(филиал)
Курсовая работа
по дисциплине «Системное программирование»
АСИНХРОННЫЙ ВВОД/ВЫВОД
Руководитель Шанаев И.Н
Студентка группы 22351
Михайлова А.Г.
Старая Русса
г.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
ФУНКЦИИ АСИНХРОННОГО ВВОДА/ВЫВОДА
ПРОЦЕДУРЫ DELPHI
СОЗДАНИЕ БЛОКНОТА НА DELPHI
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ А
Под "Асинхронным вводом/выводом" в основном понимается возможность процесса выполнять ввод/вывод одновременно из многих источников. В частности асинхронным называют такой ввод/вывод, который производиться в том момент, когда входные данные доступны или выходные буферы свободны для принятия очередной порции данных. Это отличает асинхронных ввод/вывод от блокирующего, при котором операции чтения/записи пытаются выполняться, невзирая на доступность ресурсов, что типично приводит к блокировкам. Асинхронный ввод/вывод сам по себе несложен, обычно вопрос в том, чтобы одновременно контролировать много каналов, через которые должен выполняться ввод/вывод.
Ввод и вывод всегда выполнялись медленнее других операций. Эта низкая скорость вызвана следующими факторами:
задержки вследствие поиска дорожки и сектора на устройствах произвольного доступа;
задержки, вызванные относительно малой скоростью передачи данных между физическим устройством и системной памятью;
задержки при передаче данных через сеть;
Операции ввода-вывода во многих случаях являются синхронными с потоками. Иными словами, весь поток должен был ждать, пока ввод-вывод не завершится.
Асинхронный ввод/вывод - принципиально новая возможность введена впервые в Win32 с появлением реальной многозадачности. Вызывая функции чтения и записи данных, вы на самом деле передаете исходные данные одному из потоков (threads) операционной системы, который и осуществляет фактические обязанности по работе с устройством. Время доступа всех периферийных устройств гораздо больше доступа к ОЗУ, и ваша программа, вызвавшая Read или write, будет дожидаться окончания операции ввода/вывода. Замедление работы программы налицо.
Асинхронный ввод/вывод не может осуществить ни одна из родных Delphi
функций: ни функции FileRead/FileWrite, ни функции, доставшиеся нам от pascal
BlockRead/BlockWrite, ни класс TFileStream. Асинхронный ввод/вывод можно
осуществить только через API функции..
Рисунок 1.Схема асинхронного ввода/вывода
Функция CreateFile. С помощью этой функции можно
открыть на чтение или запись многие объекты: порты COM, дисковые устройства (для
прямой работы с диском), пайпы и т.д.
HANDLE CreateFile(lpFileName, // имя файлаdwDesiredAccess, // тип доступаdwShareMode, // параметры общего доступа_ATTRIBUTES lpSecurityAttributes,//атрибуты защитыdwCreationDistribution, // создавать или открыватьdwFlagsAndAttributes, // дополнительные атрибутыhTemplateFile // нужен при создании файлов
Создание процедуры Delphi является оптимальным решением для разумного использования блока операторов. Нам не нужно каждый раз прописывать блок операторов, а просто написав его один раз, его нужно будет просто вызвать по имени, и он сделает всю работу.
Как будет выглядеть общая схема процедуры будет выглядеть таким образом:
delphi блокнот оператор
Рисунок 2. Общая схема процедуры
Описание процедуры состоит из двух основных частей: заголовка и тела
процедуры. Заголовок процедуры включает в себя зарезервированное слово
procedure, имя процедуры и список формальных параметров. В списке формальных
параметров нужно указывать тип этого параметра. Также допускается отсутствие
формальных параметров. Имя процедуры - это уникальный идентификатор, по
которому обращаются к процедуре. Нетрудно заметить, что процедурный блок по
структуре похож на саму программу.
Наглядным примером асинхронного ввода/вывода является блокнот, рассмотрим его создание.
Первым делом мы должны построить базовый интерфейс пользователя
приложения. Для этого добавьте в окно Designer Surface компоненты TMainMenu,
TMemo, TActionList,TOpenDialog, TSaveDialog, TStatusBar (категория Win32) и
компонент TToolbar.
Рисунок 3. Создание формы
Форме дайте имя MainForm.
После этого выберите компонент TMainMenu и создайте группы меню
Файл,Правка и Формат. Не создавайте пока что никаких пунктов меню, поскольку
для реализации команд меню будут использоваться действия.
Рисунок 4. Реализация команд
Теперь выберите компонент ТМеmо и выполните следующие шаги:
Присвойте свойству Align значение alClient. чтобы компонент занял всю клиентскую область формы.
Удалите текст Memo1 из свойства Lines.
Присвойте свойству ScrollBars значение ssVertical. чтобы отобразить вертикальную линейку прокрутки и позволить пользователю без труда просматривать обширные текстовые файлы.
Меню File
Меню Файл должно содержать команды, которые позволят пользователю
завершать работу приложения, создавать, загружать и сохранять файлы.
Рисунок 5.Всплывающее окно
Пока мы не будем заниматься реализацией команд Параметры страницы иПечать.
Чтобы создать команды меню Файл, и дважды щелкните на TActionList, чтобы отобразить окно редактора Action List (Список действий).
Во-первых, нам необходимо создать команду Файл - Выход. Щелкните на кнопкеNew Action (Новое действие), чтобы создать новое действие, и выполните следующие шаги:
Присвойте свойству Caption нового действия значение Выход.
Сведите в свойстве Hint строку Выход из программы.
Присвойте действию имя ExitAction.
И, наконец, назначьте действие неименованному пункту меню в меню Файл.
Чтобы закрыть приложение, достаточно вызвать метод Close формы в
обработчике события OnExecute действия:
Рисунок 6. Код программы
Загрузка документов
Теперь необходимо реализовать команду Файл - Открыть, чтобы пользователь мог открывать существующие файлы. Во-первых, необходимо объявить приватную переменную, которая будет хранить имя файла открытого документа.
Эта переменная необходима в команде Файл - Сохранить, а также в некоторых
других местах, о чем будет сказано чуть позже.

Чтобы пользователь мог выбрать существующий документ, вы должны
использовать компонент TOpenDialog. Измените свойство Filter, чтобы диалоговое
окно показывало только файлы с простым текстом, имеющие расширение .txt.
Рисунок 9.Фильтр
Будет разумным всегда добавлять фильтр All File Types, поскольку пользователь может иметь документы с простым текстом, сохраненные с расширением, отличным от .txt.
Теперь добавьте новое действие в список действий и измените его настройки следующим образом:
В свойстве Caption нового действия введите Открыть.
В свойстве Hint введите Открыть существующий документ.
Присвойте действию имя OpenAction.
Назначьте свойству Shortcut комбинацию Ctrl+O.
Чтобы загрузить текстовый документ в компонент ТМеmо. вы должны сделать несколько вещей. Во-первых, вы должны вызвать метод Execute компонентаTOpenDialog, чтобы пользователь мог выбрать документ. Если пользователь щелкнул на кнопке ОК в диалоговом окне, имя выбранного файла будет записано в свойство FileName компонента TOpenDialog, и метод Execute вернет значениеTrue.
Когда метод Execute возвращает True, вы должны скопировать имя выбранного
файла в переменную FOpenedFile. а затем вызвать метод LoadFromFile, чтобы
загрузить выбранный текстовый документ в свойство Lines компонента ТМеmо.
Опять-таки поместите этот код в обработчик события OnExecute действия.
Рисунок 10. Код программы
И последнее что потребуется сделать - это создать команду Открыть в меню Файли назначить действие OpenAction свойству Action нового меню.
Сохранение документов
Большинство приложений имеют две разные команды, которые позволяют пользователю сохранить документ: Сохранить и Сохранить как. КомандаСохранить используется для сохранения изменений в существующем документе, а команда Сохранить как - для сохранения документа, который не существует на диске или для сохранения копии существующего документа под другим именем.
Для начала мы реализуем команду Файл - Сохранить как. Команда Сохранить какдолжна позволить выбрать каталог и имя файла для документа с помощью компонента TSaveDialog. Измените свойства TSaveDialog:
В поле свойства DefaultExt введите txt, чтобы в диалоговом окне к имени файла автоматически добавлялось расширение .txt.
Создайте такой же фильтр, как и для компонента TOpenDialog.
Раскройте группу Options и присвойте свойству ofOverwritePrompt значениеTrue.
После того как вы включите свойство ofOverwritePrompt в набор Options, компонент TSaveDialog автоматически сгенерирует предупреждающее сообщение, если пользователь попытается использовать имя файла, который уже используется.
Теперь откройте редактор Action List и создайте действие Сохранить как:
В поле свойства Caption введите Сохранить как...
Присвойте действию имя SaveAsAction.
В поле свойства Hint введите Сохранить активный документ под новым именем.
Наконец, поместите код в обработчик событий OnExecute, a затем назначьте это действие неименованному пункту в меню Файл.
Рисунок 11. Код программы
Действие Сохранить должно выполнить две вещи: сохранить изменения, произведенные в активном документе, если документ существует, или отобразить диалоговое окно Сохранить как, если документ не существует.
Чтобы создать действие Сохранить, выполните следующие шаги:
Создайте новое действие в редакторе Action List.
В поле свойства Caption нового действия введите Сохранить.
В поле свойства Hint введите Сохранить активный документ.
Присвойте действию имя SaveAction.
Назначьте свойству Shortcut комбинацию Ctrl+S.
Ниже показан обработчик события OnExecute действия Сохранить:
Рисунок 12. Код программы
Создание новых документов
Команда Файл - Новый сама по себе очень простая, поскольку мы должны выполнить всего лишь следующие шаги:
Очистить переменную FOpenedFile, чтобы приложение знало, что активный документ не существует.
Удалить существующий текст из компонента Memo1, вызвав метод Clear.
Чтобы создать действие Новый, выполните перечисленные ниже шаги:
Создайте новое действие в редакторе Action List.
В поле свойства Caption введите Новый.
В поле свойства Hint введите Создать новый документ.
Присвойте действию имя NewAction.
Назначьте свойству ShortCut комбинацию Ctrl+N.
Добавьте код в обработчик события OnExecute.
Рисунок 13. Код программы
Назначьте действие NewAction неименованному пункту в меню Файл.
Защита данных пользователя
Теперь, когда работа над меню File завершена, необходимо написать еще
несколько строк кода, который будет защищать содержимое активного документа.
Рисунок 14.Окно программы
Грамотно спроектированное приложение должно проверять, изменял ли пользователь содержимое активного документа, и спрашивать пользователя о том, желает ли он сохранить документ, прежде чем разрешать пользователю:
Создавать новый документ.
Открывать существующий документ.
Закрывать все приложение.
Например, если в редакторе Блокнот вы введете некоторый текст, а затем попытаетесь закрыть редактор, то он автоматически уведомит о том, что вы не сохранили самый последний вариант изменений в документе, и позволит либо сохранить их, либо отменить изменения в активном документе.
Реализовать описанное поведение лучше всего, если создать функцию,
которая будет проверять, изменял ли пользователь текст в редакторе, и
спрашивать пользователя, желает ли он отменить либо сохранить изменения.
Рисунок 15. Код программы
Если текст, отображенный в редакторе, не был изменен, функция возвращаетTrue, в результате чего мы можем либо закрыть все приложение, либо заменить текст в редакторе пустым или существующим документом. Если текст в редакторе был изменен, вызывается функция MessageDlg, чтобы пользователь мог сохранить или отменить текст, отображенный в редакторе. Если пользователь щелкает на кнопке Yes (Да), функция сначала инициирует действие Сохранить для сохранения документа и возвращает True, чтобы уведомить о том, что теперь документ можно закрыть. Если пользователь щелкает на кнопке No (Нет), функция возвращает True, поскольку пользователь желает отменить изменения. Наконец, если пользователь щелкает на кнопке Cancel (Отмена), функция возвращает False, чтобы уведомить о том, что нельзя ни закрывать приложение, ни заменять активный документ другим.
Теперь необходимо вызвать функцию CloseCurrentDocument в действияхНовый и
Открыть, чтобы спросить пользователя о дальнейших действиях, если в текст были
внесены изменения.
Рисунок 16. Код программы
Последнее, что потребуется делать - это написать обработчик для событияOnCloseQuery формы.
Это событие возникает тогда, когда пользователь пытается закрыть форму. Параметр CanClose события OnCloseQuery позволяет определить, может ли форма быть закрыта или нет.
Рисунок 17. Код программы
Меню Edit
Все команды меню Edit будем создавать вручную.
Отмена
Для начали создадим действие Отменить:
Создайте новое действие.
В поле свойства Caption введите Отменить.
В поле свойства Hint введите Отменить последнее действие.
Присвойте действию имя UndoAction.
Назначьте свойству Shortcut комбинацию Сtrl+Z.
Чтобы отменить действия в редакторе, вы должны вызвать метод Undo. Чтобы
узнать, можете ли вы отменить какое-либо действие, необходимо вызвать метод
CanUndo. Но лучше всего вызвать метод CanUndo в событииOnUpdate действия, чтобы
запретить действие в случае невозможности выполнения отмены.
Рисунок 18. Код программы
Назначьте действие UndoAction неименованному пункту в меню Правка.
Вырезание и копирование в буфер обмена