Для студентов згиа специальности 080403 ”Программное обеспечение




НазваниеДля студентов згиа специальности 080403 ”Программное обеспечение
страница15/34
Дата публикации25.02.2013
Размер3.71 Mb.
ТипМетодическое пособие
uchebilka.ru > Информатика > Методическое пособие
1   ...   11   12   13   14   15   16   17   18   ...   34
^

Асинхронный доступ к данным

2.12.1 Концепция асинхронного ввода-вывода


Синхронный и асинхронный ввод-вывод концептуально нисколько не отличается от синхронного и асинхронного обмена данными [5]. При синхронной записи данных в файл поток, выдавший команду записи, блокируется до тех пор, пока данные не будут записаны в файл или буфер. При асинхронной записи данных в файл, после выдачи команды на запись данных, поток не блокируется, а продолжает свою работу. Соответственно, при синхронном чтении данных из файла поток, выдавший команду чтения, блокируется до тех пор, пока данные не будут прочитаны из файла. При асинхронном чтении данных такой блокировки не происходит, и поток продолжает свое исполнение. В операционных системах Windows асинхронный ввод-вывод также называется перекрывающимся (overlapped) вводом-выводом. Для асинхронного ввода-вывода данных в операционных системах Windows используются те же функции ReadFile и WriteFile, что и для синхронного ввода-вывода. Однако в этом случае файл должен быть открыт в режиме FILE_FLAG_OVERLAPPED.

Возникает вопрос: как поток узнает о завершении асинхронной операции чтения или записи? Это можно сделать двумя способами.

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

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

typedef struct _OVERLAPPED{

DWORD Internal; // для использования операционной системой

DWORD InternalHigh; // для использования операционной системой

DWORD Offset; // младшая часть смещения относительно начала файла

DWORD OffsetHigh; //старшая часть смещения относительно начала файла

HANDLE hEvent; // дескриптор события

} OVERLAPPED, * LPOVERLAPPED;

Поля Internal и InternalHigh этой структуры зарезервированы для использования операционной системой.

В полях offset и offsetHigh устанавливаются соответственно младшая и старшая части смещения относительно начала файла. Начиная с этого смещения, операционная система выполняет чтение или запись данных.

В параметре hEvent устанавливается дескриптор события, которое операционная система устанавливает в сигнальное состояние после завершения асинхронной операции ввода-вывода.

При одновременной работе нескольких асинхронных операций ввода-вывода для каждой из них нужно определить свою структуру типа OVERLAPPED, в которой указать дескриптор отдельного события, связанного только с этой операцией ввода-вывода.

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

^

2.12.2 Асинхронная запись данных


Асинхронная запись данных в файл работает только на платформах Windows NT/2000/XP. Выполнить асинхронную запись данных можно при помощи функции WriteFile, которая имеет следующий прототип

BOOL WriteFile(

HANDLE hFile, // дескриптор файла

LPCVOID lpBuffer, // указатель на буфер данных

DWORD nNumberOfBytesToWrite,// количество записываемых байтов LPDWORD lpNumberOfBytesWritten, // количество записанных байтов LPOVERLAPРЕD lpOverlapped // используется при асинхронной записи

);

При асинхронной записи данных в файл эта функция возвращает ненулевое значение в том случае, если запись данных в файл уже завершилась до вы-хода из функции WriteFiie. Если же функция возвращает FALSE, то нужно проверить код последней ошибки путем вызова функции GetLastError. Если эта функция возвращает значение ERROR_IO_PENDING, то это значит, что операция вывода данных еще не закончилась.

Кратко опишем назначение параметров этой функции. При этом отметим, что в отличие от синхронного вывода при асинхронном выводе также ис-пользуется последний параметр lpOverlapped функции WriteFiie.

Параметр hFile должен содержать дескриптор файла, причем файл должен быть открыт в режиме записи. Кроме того, должен быть установлен флаг FILE_FLAG_OVERLAPPED, который указывает на асинхронный режим ввода-вывода.

Параметр lpBuf fer должен указывать на область памяти, в которую будут читаться данные.

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

Параметр lpNumberOfBytesWritten должен содержать адрес памяти, в которую функция WriteFile поместит количество фактически записанных в файл байтов. При выполнении функции WriteFile операционная система записывает по этому адресу ноль, прежде чем выполнить запись данных в файл. При асинхронном выводе значение этого параметра может быть установлено в NULL. В этом случае для определения количества байт, которые функция записала в файл, можно использовать функцию GetOverlappedResult.

Параметр lpOverlapped должен указывать на структуру типа OVERLAPPED. Причем в этой структуре должны быть установлены поля offset и offsetHigh. В поле hEvent может быть помещен как дескриптор события, так и значение NULL. В первом случае система устанавливает событие в сигнальное состояние по завершении операции вывода. Во втором случае завершение операции вывода можно определить по дескриптору файла, который устанавливается в сигнальное состояние по завершении операции вывода, а при запуске новой операции вывода — сигнальное состояние файла сбрасывается.

В листинге 2.15 приведена программа, которая выполняет асинхронную запись данных в файл. В этой программе для сигнализации о завершении операции вывода используется дескриптор файла.
Листинг 2.15. Асинхронная запись данных в файл с использованием дескриптора

#define _WIN32_WINNT 0x0400

#include

#include
int main()

{

HANDLE hFile; // дескриптор файла

OVERLAPPED ovl; // структура управления асинхронным доступом к файлу

// инициализируем структуру OVERLAPPED

ovl.Offset =0; // младшая часть смещения равна 0

ovl.OffsetHigh = 0; // старшая часть смещения равна 0

ovl.hEvent =0; // события нет

// создаем файл для записи данных

hFile = CreateFile("С:\\demo_file.dat", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,

^ FILE_FLAG_OVERLAPPED, NULL)

// проверяем на успешное создание

if(hFile ==INVALID_HANDLE_VALUE)

{

cerr << "Create file failed." << endl

<< "The last error code: " << GetLastError() << endl;

cout << "Press any key to finish.";

cin.get();

return 0;

}

// пишем данные в файл

for (int і = 0; і < 10; ++і)

{

DWORD dwBytesWrіte;

DWORD dwRet;

if (!WriteFile(hFile, &i, sizeof(i), &dwBytesWrite, &ovl))

dwRet = GetLastError();

if(dwRet == ERROR_IO_PENDING)

cout << "Write file pending." << endl;

else

{

cout << "Write file failed." << endl

<< "The last error code: " << dwRet << endl;

return 0;

}

}

// ждем, пока завершится асинхронная операция записи

WaitForSingleObject(hFile, INFINITE); // увеличивает смещение в файле ovl.Offset += sizeof(і);

}

// закрываем дескриптор файла

CloseHandle(hFile);

cout << "The file is written." << endl;

return 0;

}




1   ...   11   12   13   14   15   16   17   18   ...   34

Похожие:

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к лабораторному практикуму для студентов згиа...
Методические указания к лабораторному практикуму для студентов згиа специальности 080403 «Программное обеспечение автоматизированных...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания для студентов специальности 080403
Згиа [8, 10] и других вузов [4]. Наиболее полно описаны курсовые, дипломные и квалификационные работы, однако большинство положений...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к курсовой работе по дисциплине «Системное...
Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» для студентов специальности...

Для студентов згиа специальности 080403 ”Программное обеспечение iconПравила использования программного обеспечения в рамках программы...
Используя программное обеспечение вы тем самым подтверждаете свое согласие придерживаться этих правил. Если вы не согласны, не используйте...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания по выполнению лабораторных работ по курсу “
Информационные управляющие системы и технологии, 080403 – Программное обеспечение автоматизированных систем

Для студентов згиа специальности 080403 ”Программное обеспечение iconКлассификация программного обеспечения
В отличие от аппаратного обеспечения, программы, которые выполняются на нем, неосязаемы и классифицируются как программное обеспечение....

Для студентов згиа специальности 080403 ”Программное обеспечение iconКурсовая работа выполняется на основании 'Задания на курсовую работу'...
Целью курсовой работы является закрепление практических навыков самостоятельной постановки и решения задачи обработки данных с помощью...

Для студентов згиа специальности 080403 ”Программное обеспечение icon1. Классификация программного обеспечения
Назначением ЭВМ является выполнение программ. Программа содержит команды, определяющие порядок действии компьютера. Совокупность...

Для студентов згиа специальности 080403 ”Программное обеспечение iconОпорный конспект лекций по дисциплине Компьютерная графика для специальности...
Тема. Основные понятия компьютерной графики. Аппаратное и программное обеспечение

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания и задание к выполнению курсового проекта по...
Методические указания и задание к выполнению курсового проекта по дисциплине «Алгоритмическое и программное обеспечение электротехнических...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<