Реализация функциональности

Для пуска функции асинхронного чтения из файла ReadFile, нужно за ранее приготовить несколько переменных, а конкретно: hFile, inBuffer, nBytesToRead, hEvent1, gOverLapped. А сейчас о каждой из их по порядку.

hFile= CreateFile(fileName, // Открываемый файл

GENERIC_READ, // Открываем для чтения

FILE_SHARE_READ, // Для совместного чтения

NULL, // Защита по дефлоту

OPEN_EXISTING, // Только имеющийся Реализация функциональности файл

FILE_FLAG_OVERLAPPED, // в асинхронном режиме

NULL); // Атрибутов шаблона нет

Макет этой функции смотрится последующим образом:

HANDLE CreateFile(

LPCTSTR lpFileName, // название файла

DWORD dwDesiredAccess, // режим доступа

DWORD dwShareMode, // кооперативный доступ

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD (дескр. защиты)

DWORD dwCreationDisposition, // как действовать

DWORD dwFlagsAndAttributes, // атрибуты файла

HANDLE hTemplateFile // дескр.шаблона файла

);

Характеристики

lpFileName

[in] Указатель на символьную строчку с нулем в конце, устанавливающую Реализация функциональности имя объекта, который создается либо раскрываться.

dwDesiredAccess

[in] Тип доступа к объекту (чтение, запись либо то и другое).

lpSecurityAttributes

[in] Указатель на структуру SECURITY_ATTRIBUTES, которая устанавливает может ли возвращенный дескриптор быть унаследован дочерними процессами. Если lpSecurityAttributes имеет значение ПУСТО (NULL), дескриптор не может быть унаследован.

dwShareMode

[in] Режим Реализация функциональности совместного доступа (чтение, запись, оба либо никакого деяния). Может принимать последующие значения:

Значение Назначение
FILE_SHARE_DELETE Разрешает следующие операции открытия объекта, которые требуют доступа к его удалению. В неприятном случае, другие процессы не сумеют открыть объект, если они потребуют доступа к удалению.
FILE_SHARE_READ Разрешает следующие операции Реализация функциональности открытия объекта, которые требуют доступа для чтения. В неприятном случае, другие процессы не сумеют открыть объект, если они потребуют доступа для чтения.
FILE_SHARE_WRITE Разрешает следующие операции открытия объекта, которые требуют доступа для записи. В неприятном случае, другие процессы не сумеют открыть объект, если они потребуют доступа Реализация функциональности для записи.

dwCreationDisposition

[in] Выполняемые деяния с файлами, которые есть и выполняемые деяния с файлами, которые не есть. Подробную информацию об этом параметре см. в разделе Замечаний. Этот параметр должен быть одним из нижеперечисленных значений:

Значение Назначение
CREATE_NEW Делает новый файл. Функция заканчивается ошибкой, если данный файл уже Реализация функциональности существует.
CREATE_ALWAYS Делает новый файл. Если файл существует, функция переписывает файл, сбрасывает имеющиеся атрибуты и соединяет воединыжды, данные параметром dwFlagsAndAttributes атрибуты файла и флажки, с FILE_ATTRIBUTE_ARCHIVE, но не устанавливает дескриптор безопасности данный структурой SECURITY_ATTRIBUTES.
OPEN_EXISTING Открывает файл. Функция заканчивается ошибкой, если файл Реализация функциональности не существует.
OPEN_ALWAYS Открывает файл, если такой существует. Если файл не существует, функция делает файл, будто бы бы dwCreationDisposition имел значение CREATE_NEW.
TRUNCATE_EXISTING Открывает файл и обрезает его так, чтоб его размер приравнивался нулю байтов. Вызывающий процесс должен открыть файл с правом доступа GENERIC_WRITE . Функция заканчивается ошибкой, если Реализация функциональности файл не существует.

dwFlagsAndAttributes

[in] Атрибуты и флажки файла. Подробный перечень вероятных значений см.[2]

hTemplateFile

[in] Дескриптор файла шаблона с правом доступа GENERIC_READ. Файл шаблона предоставляет атрибуты файла и дополнительные атрибуты для создающегося файла. Этот параметр должен быть ПУСТО (NULL).

Возвращаемые значения

Если функция заканчивается удачно, возвращаемое Реализация функциональности значение - открытый дескриптор данного файла. Если данный файл существовал до вызова функции, а параметр dwCreationDisposition установлен в CREATE_ALWAYS либо OPEN_ALWAYS, вызов GetLastError возвращает значение ERROR_ALREADY_EXISTS (даже при том, что функция закончилась удачно). Если файл не существовал перед вызовом функции, функция GetLastError возвращает нуль.

Дальше, если открытие файла Реализация функциональности прошло без ошибок – создаем два потока:

if (_beginthread(thread2,1024,NULL)==-1)//Пуск второго потока чтения

cout <

else threadsWork++;

if (_beginthread(thread1,1024,NULL)==-1)//Пуск первого потока чтения

cout <

else threadsWork++;

Первым параметром в функцию _beginthread передается заглавие запускаемого потока, вторым – размер Реализация функциональности стека, а третим – перечень параментров, в нашем случае NULL. Если при запуске потока произошла ошибка – выдаем сообщение, по другому добывляем один поток в перечень работающих.

char inBuffer[N+1]="\0"; – буфер, в который будет помещен итог чтения по окончанию даного деяния, где N – количество читаемых б данных. Во избежании попадания в буфер «мусора Реализация функциональности» инициализируем его эмблемой конца строчки;

DWORD nBytesToRead=N - количество читаемых б данных;

Макет функции CreateEvent, служащей для сотворения действия:

HANDLE CreateEvent

(

LPSECURITY_ATTRIBUTES lpEventAttributes,// атрибут защиты

BOOL bManualReset, // тип сброса TRUE - ручной

BOOL bInitialState, // изначальное состояние TRUE - сигнальное

LPCTSTR lpName // имя обьекта

);

Эта функция возвращает дескриптор действия, который мы присваиваем hEvent1.

Последующим шагом Реализация функциональности инициализируем структуру последующими значениями:

gOverLapped.Offset = 0;

gOverLapped.OffsetHigh = 0;

gOverLapped.hEvent = hEvent2;

чем и указываем, что мы должны читать с начала.

Сейчас у нас все готово до вызова ReadFile:

ReadFile(hFile,&inBuffer,nBytesToRead,&nBytesRead,&gOverLapped);

ReadFile и WriteFile возвращают ненулевые значения, если запрошенный ввод-вывод выполнился синхронно, если же Реализация функциональности асинхронно либо появляется ошибка — возвращают FALSE. В последнем случае, чтоб найти, что конкретно вышло, вызовите GetLastError. Если она возвращает ERROR_IO_PENDING, означает, запрос ввода-вывода удачно помещен в память и будет завершен позже.

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

-ERRORINVALIDUSERBUFFER либо ERROR NOTENOUGHMEMORY

Каждый драйвер устройства поддерживает расположенный в неперемещаемом пуле перечень фиксированной длины, в каком содержатся ожидающиевыполнения запросы. Если этот перечень заполнен, система не может поставить в очередь Реализация функциональности ваш запрос и ReadFile либо WriteFile возвращают FALSE, а функция GetLastError возвращает один из этих 2-ух кодов ошибки (зависимо от драйвера).

-ERROR_NOT_ENOUGH_QUOTA Некие устройства требуют, чтоб ваш буфер данных находился на закрепленной страничке, чтоб данные не могли откачиваться из ОЗУ при ожидании ввода-вывода. Это требование всегда Реализация функциональности имеет место при установленно.м флаге FILE_FLAG_NO_BUFFERING. Но система ограничивает объем закрепленной памяти, выделяемый одному процессу. При невозможности расположить ваш буфер в неперемещаемой памяти ReadFile и WriteFile возвращают FALSE, а GetLastError — ERROR_NOT_ENOUGH_QUOTA. Прирастить квоту для процесса позволяет функция SetProcessWorkingSetSize.

По имеющемуся дескриптору объекта можно Реализация функциональности найти его текущее состояние. Это делается при помощи т.н. ожидающих функций. В большинстве случаев употребляется функция WaitForSingleObject. Эта функция воспринимает два параметра, 1-ый из которых - дескриптор объекта, 2-ой - время ожидания в мсек. Функция возвращает WAIT_OBJECT_0, если объект находится в сигнальном состоянии, WAIT_TIMEOUT - если истекло время ожидания Реализация функциональности, и WAIT_ABANDONED, если объект-взаимоисключение не был освобожден до того, как обладающий им поток закончился. Если время ожидания обозначено равным нулю, функция возвращает итог немедля, в неприятном случае она ожидает в течение обозначенного промежутка времени. В случае, если состояние объекта станет сигнальным до истечения сих пор, функция возвратит WAIT_OBJECT Реализация функциональности_0, в неприятном случае функция возвратит WAIT_TIMEOUT. Если в качестве времени указана символическая константа INFINITE, то функция будет ожидать неограниченно длительно, пока состояние объекта не станет сигнальным. Если нужно узнавать о состоянии сходу нескольких объектов, следует пользоваться функцией WaitForMultipleObjects. Чтоб окончить работу с объектом и высвободить дескриптор вызывается Реализация функциональности функция CloseHandle.

CloseHandle

Функция CloseHandle закрывает открытый дескриптор объекта.

BOOL CloseHandle( HANDLE hObject);

Характеристики

hObject

Дескриптор открытого объекта. Этим параметром может быть псевдо дескриптор либо INVALID_HANDLE_VALUE(недействительный).

Возвращаемые значения

Если функции успешна, то возвращаемое значение не равно нулю.

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

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

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

Функция FindCloseупотребляется, чтоб закрыть дескрипторы, возвращенные вызовом функции FindFirstFile.

WaitForSingleObject

Функция WaitForSingleObject ворачивается, когда обозначенный объект находится в сигнальном состоянии либо если время ожидания истекло.

DWORD WaitForSingleObject Реализация функциональности( HANDLE hHandle, DWORD dwMilliseconds);

Характеристики

hHandle

Дескриптор объекта.

Если дескриптор закрыт, когда ожидание этого объекта еще не закончено, то поведение функции не определено.

Дескриптор обязан иметь право доступа SYNCHRONIZE. Выяснить больше см. Standard Access Rights.

dwMilliseconds

Интервал ожидания в миллисекундах. Функция ворачивается, если время истекло, даже если объект находится в несигнальном состоянии. Если параметр dwMilliseconds равен Реализация функциональности нулю, функция инспектирует состояние объекта и немедля ворачивается. Если параметр dwMilliseconds равен INFINITE, то интервал ожидания функции не истечет никогда.

Возвращаемые значения

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

Возвращаемое значение/код Описание
WAIT_ABANDONED 0x00000080L Обозначенный Реализация функциональности объект не был освобожден владеющим им потоком до окончания этого потока. Владение объектом мьютекса передается вызывающему сгустку, и мьютекс устанавливается в несигнальное состояние.
WAIT_OBJECT_0 0x00000000L Обозначенный объект находится в сигнальном состоянии.
WAIT_TIMEOUT 0x00000102L Время ожидания истекло, и объект находится в несигнальном состоянии.

Если Реализация функциональности функция заканчивается не удачно, то возвращаемое значение равно WAIT_FAILED. Для того чтоб получить информацию о произошедшей ошибке нужно вызвать функцию GetLastError.

Замечания

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


Испытания

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


Заключение

В связи с тем, что в текущее время обширное распространение получили многозадачные системы животрепещущей становится неувязка синхронизации. При асинхронном чтении из файла самый обычной метод синхронизации состоит в том, что задачка, вызывающая функции ReadFile либо Реализация функциональности WriteFile в асинхронном режиме, записывает в поле hEvent структуры OVERLAPPED значение NULL. После вызова обозначенных выше функций, когда задачке необходимо дождаться окончания выполнения асинхронной операции, она вызывает функцию WaitForSingleObject, передавая ей в качестве первого параметра идентификатор файла. Другой метод подразумевает создание отдельного объекта-события, идентификатор которого записывается Реализация функциональности в поле hEvent структуры OVERLAPPED при инициализации последней. В данном случае в качестве первого параметра функции WaitForSingleObject следует передать идентификатор этого объекта-события. Как файловая операция будет завершена, объект-событие перейдет в отмеченное сосотояние.

В данной работе был выполнен обзор функций API для работы с событиями (events) ОС семейства Реализация функциональности Windows, разработана и написанана программка, для множественного асинхронного чтения данных из файла с внедрением дескриптора и событиймеханизмов мьютексов WinApi, также предложена программная реализация задачки читателей-писателей с их внедрением с ценностью по записи. Был проведен аналитический обзор литературы по данной теме, что отдало возможность создать ряд алгоритмов и избрать Реализация функциональности из их, на мой взор, более устойчивое и быстродействующее решение, представленное в данной работе.


Литература

1. Рихтер Дж., Программирование серверных приложений для Microsoft Windows 2000. СПб.: Питер; М.: Издательско-торговый дом, 2001.

2. http://www.vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_createfile.htm

3. http://www.vsokovikov.narod.ru/New_MSDN_API Реализация функциональности/Menage_files/fn_readfile.htm

4. http://www.vsokovikov.narod.ru/New_MSDN_API/Synchronization/str_overlapped.htm

5. http://pblog.ru/?p=74

6. http://frolov-lib.ru/books/bsp/v26/ch5_4.htm

7. MSDN Library for Visual Studio 2008


ПРИЛОЖЕНИЕ А


realizuet-obrazovatelnie-programmi-nachalnogo-obshego-obrazovaniya-uchreditel-administraciya-municipalnogo-rajona-yakovlevskij-rajon-v-lice-glavi-administracii-rajona.html
realnaya-i-idealnaya-sovokupnosti.html
realnaya-skazka-stranica-12.html