Задание 23. Асинхронное чтение из файла.

Тип задания:разработка.

Уровень трудности: завышенный.

При асинхронном чтении данных из файла, после выдачи команды на чтение, поток не блокируется до окончания операции, а продолжает свою работу. В ОС Windows асинхронный ввод-вывод именуется перекрывающимся (overlapped) вводом-выводом. Асинхронный ввод-вывод в ОС Windows делают «обычные» ф-ции ReadFile и WriteFile Задание 23. Асинхронное чтение из файла., но файл при всем этом должен быть открыт в режиме FILE_FLAG_OVERLAPPED.

О окончании операции ввода-вывода можно выяснить или по факту перехода дескриптора файла в сигнальное состояние (этот метод не годится, если с файлом сразу работает несколько потоков ввода-вывода), или используя особое событие, устанавливаемое Задание 23. Асинхронное чтение из файла. ОС по окончанию операции в сигнальное состояние. Дескриптор этого действия должен находиться в структуре типа OVERLAPPED, адресок которой передается ф-циям асинхронного ввода-вывода.

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

Рекомендуемые источники:

· Столлингс В. Операционные системы, 4-е изд.: - М.: Изд. дом "Вильямс", 2002.

· Электрический справочник «Win32 Programmer’s Reference» из состава «MS SDK Help Files».

Проектное задание:

· Ознакомиться с механизмом асинхронного ввода-вывода ОС Windows.

· Изучить предназначение и внедрение функций API для работы с событиями (events).

· Выполнить обзор соответственных функций Задание 23. Асинхронное чтение из файла. API.

· Создать и воплотить программку согласно условию задачки.

· Создать набор тестов для демонстрации работоспособности и корректности программки.

· Приготовить отчет по курсовому проекту.

Задачка:

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

Спроектировать, закодировать и отладить программки.

Язык Задание 23. Асинхронное чтение из файла. реализации – случайный, ОС – Windows.


ПРИЛОЖЕНИЕ Б

(Блок- схема метода работы программки)


ПРИЛОЖЕНИЕ В

(Листинг программной реализации асинхронного чтения с файла)

#include

#include

#include

using namespace std;

const int N=1019000;//Количество читаемых б

HANDLE hFile;

HANDLE hEvent1,hEvent2;

int threadsWork=0;

char* rus(char* message)

{

char* tmp=new char[strlen(message)+1];

CharToOem(message Задание 23. Асинхронное чтение из файла.,tmp);

return tmp;

}

void Monitor1(void *)

{

DWORD dwWaitResult=1;

while(dwWaitResult!=WAIT_OBJECT_0)//Если чтение не закончилось

{

dwWaitResult = WaitForSingleObject(hEvent1,1); //Ожидаем событие окончания чтения

cout<

}

threadsWork--;

cout<

_endthread();//окончание потока

}

void Monitor2(void *)

{

DWORD dwWaitResult=1;

while(dwWaitResult!=WAIT_OBJECT_0)//Если чтение не закончилось

{

dwWaitResult = WaitForSingleObject(hEvent2,1);//Ожидаем событие Задание 23. Асинхронное чтение из файла. окончания чтения

cout<

}

threadsWork--;

cout<

_endthread();//окончание потока

}

void thread1(void*)

{

char inBuffer[N+1]="\0";

DWORD nBytesToRead=N,nBytesRead,dwError;

hEvent1=CreateEvent(NULL,true,false,"event1");//создаем событие окончания чтения

if(hEvent1==NULL)

{

char error[30];

sprintf(error,"Такое событие уже существует (ошибка %d)",GetLastError Задание 23. Асинхронное чтение из файла.());

cout<

system("pause");

exit(-1);

}

OVERLAPPED gOverLapped;

// подготавливаем поля структуры асинхронной операции

gOverLapped.Offset = 0;

gOverLapped.OffsetHigh = 0;

gOverLapped.hEvent = hEvent1;

bool bResult;

//do{

// пытаемся провести асинхронную операцию чтения

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

// если появляется неувязка либо асинхронная операция

// все еще ждет обработки ...

if (!bResult&&GetLastError()==ERROR_HANDLE_EOF)

{

// мы Задание 23. Асинхронное чтение из файла. достигнули конца файла

// в течение вызова к ReadFile

cout<

//break;

} // конец процедуры if

//cout<<" 1="<

//gOverLapped.Offset+=nBytesRead;}while(bResult);

cout<

CloseHandle(hEvent1);//Закрытие дескриптора действия

_endthread();//окончание потока

}

void thread2(void*)

{

char inBuffer[N+1]="\0";

DWORD nBytesToRead=N,nBytesRead,dwError;

hEvent2=CreateEvent(NULL,true,false,"event2");//создаем событие Задание 23. Асинхронное чтение из файла. окончания чтения

if(hEvent2==NULL)

{

char error[30];

sprintf(error,"Такое событие уже существует (ошибка %d)",GetLastError());

cout<

system("pause");

exit(-1);

}

OVERLAPPED gOverLapped;

// подготавливаем поля структуры асинхронной операции

gOverLapped.Offset = 0;

gOverLapped.OffsetHigh = 0;

gOverLapped.hEvent = hEvent2;

bool bResult;

//do{

// пытаемся провести асинхронную операцию чтения

bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,&gOverLapped Задание 23. Асинхронное чтение из файла.) ;

// если достигнули конца файла

if (!bResult&&GetLastError()==ERROR_HANDLE_EOF)

{

// мы достигнули конца файла

// в течение вызова к ReadFile

cout<

//break;

} // конец процедуры if

//cout<<" 2="<

//gOverLapped.Offset+=nBytesRead;}while(bResult);

cout<

CloseHandle(hEvent2);//Закрытие дескриптора действия

_endthread();//окончание потока

}

void main()

{

if (_beginthread(Monitor1,1024,NULL)==-1)//Пуск монитора Задание 23. Асинхронное чтение из файла. действия первого потока

cout <

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

cout << rus("\nОшибка пуска потока 2 монитора\n")<< endl;

char fileName[]="D:\\file1.txt\0";

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

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

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

NULL, // Защита Задание 23. Асинхронное чтение из файла. по дефлоту

OPEN_EXISTING, // Только имеющийся файл

FILE_ATTRIBUTE_NORMAL, // Обыденный файл

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

if (hFile == INVALID_HANDLE_VALUE) //Если появилась ошибка

{

char error[30];

sprintf(error,"Не удалось открыть файл (ошибка %d)",GetLastError());

cout<

system("pause");

exit(-1);

}

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

cout <

else threadsWork++;

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

cout <

else threadsWork++;

while(threadsWork);//Ожидание окончания потоков чтения

CloseHandle(hFile);//Закрытие файла

cout<

system("pause");

}


zadanie-3-samoproverka-znanij.html
zadanie-3-soedinite-strelkami-termini-i-ih-opredeleniya.html
zadanie-3-sostavte-tablicu-poryadok-nadeleniya-polnomochiyami-sudej.html