-МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
УЧРЕЗЖЕНИЕ ОБРАЗОВАНИЯ
ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ имени П.О. Сухого
Факультет автоматизированный и информационных систем
Кафедра: «Информационные технологии»
Отчёт по лабораторной работе №6
по дисциплине : ОМПиМПОД
на тему:«Асинхронный ввод/вывод»
Подготовил: студент группы ИТ-32
Преподаватель:
Гомель 2013 г.
Цель работы: разработать программу, осуществляющую решение задачи «поставщик-потребитель» с использованием асинхронного ввода/вывода.
Задание:
Необходимо разработать двухпоточное приложение решающее задачу «поставщик-потребитель» (таблица 6.1) с использованием асинхронного ввода/вывода. Приложение должно считывать исходные данных из двух текстовых файлов в асинхронном режиме, проводить вычисления и сохранять результаты вычислений также в асинхронном режиме.
Исходный файл 1 |
Исходный файл 2 |
Поток 1 |
Поток 2 |
Листингпрограммы:
#include <windows.h>
#include <stdio.h>
#include <math.h>
HANDLE Thread_read_file_1,
Thread_read_file_2,
Thread_1,
Thread_2,
Thread_write;
int x[1][9], y[1][9]; // вектор X и Y
int tMatrix[9][1]; // транспонированная матрица
int Matrix[9][9]; // матрица
float avg;
// асинхронное чтение данных из файла file1
DWORD WINAPI Read_file_1(LPVOID lpParameter)
{
HANDLE hFile; // дескриптор файла
HANDLE hEndRead; // дескриптор события
OVERLAPPED ov; // структура управления асинхронным доступом к файлу
hEndRead = CreateEvent(NULL, TRUE, FALSE, NULL); // создаем события с автоматическим сбросом
// инициализируем структуру OVERLAPPED
ov.Offset = 0; // младшая часть смещения равна 0
ov.hEvent = hEndRead; // событие для оповещения завершения чтения
// открываем файл для чтения
hFile = CreateFile("file1.txt", // имя файла
GENERIC_READ, // чтение из файла
FILE_SHARE_READ, // совместный доступ к файлу
NULL, // защиты нет
OPEN_EXISTING, // открываем существующий файл
FILE_FLAG_OVERLAPPED, // асинхронный ввод
NULL); // шаблона нет
DWORD dwBytesRead; //количество прочитанных данных
char Buffer[9];
//читаем данные из файла
char jj[9];
int i=0;
while(i<1)
{
ZeroMemory(Buffer,sizeof(Buffer));
// читаем одну запись
ReadFile(hFile, // дескриптор файла
Buffer, // адрес буфера, куда читаем данные
sizeof(Buffer), // количество читаемых байтов
&dwBytesRead, // количество прочитанных байтов
&ov); // чтение асинхронное
WaitForSingleObject(hEndRead, INFINITE);
for (int j=0; j<9;j++)
{
jj[0]=Buffer[j];
x[i][j]=atoi(jj);
}
i++;
// увеличивает смещение в файле
ov.Offset += 11;
}
CloseHandle(hFile);
}
// асинхронное чтение данных из файла file2
DWORD WINAPI Read_file_2(LPVOID lpParameter)
{
HANDLE hFile;
HANDLE hEndRead;
OVERLAPPED ov;
hEndRead = CreateEvent(NULL, TRUE, FALSE, NULL);
ov.Offset = 0;
ov.hEvent = hEndRead;
hFile = CreateFile("file2.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
DWORD dwBytesRead;
char Buffer[9];
//читаем данные из файла
char jj[9];
int i=0;
while(i<1)
{
ZeroMemory(Buffer,sizeof(Buffer));
ReadFile(hFile,
Buffer,
sizeof(Buffer),
&dwBytesRead,
&ov);
WaitForSingleObject(hEndRead, INFINITE);
for (int j=0; j<9;j++)
{
jj[0]=Buffer[j];
y[i][j]=atoi(jj);
}
i++;
ov.Offset += 11;
}
CloseHandle(hFile);
}
// формирование Matrix
DWORD WINAPI Thread_One(LPVOID lpParameter)
{
// транспонирование вектора X
int m =9;
int n =1;
for (int i = 0; i<m; i++)
for (int j=0; j<n; j++)
tMatrix[i][j] = x[j][i];
int temp = n; n = m; m = temp;
// формирование матрицы
int i=0;
while(i<9)
{
for(int j=0;j<9;j++)
{
Matrix[i][j] = tMatrix[i][0]*y[0][j];
} i++;
}
return 1;
}
// определитель
DWORD WINAPI Thread_Two(LPVOID lpParameter)
{
int N=9;
for (int i = 0; i < N; i++)
for (int k = i + 1; k < N; k++)
avg+=(float)Matrix[k][i] / (N * N);
return 1;
}
// запись в файл
DWORD WINAPI Write(LPVOID lpParameter)
{
HANDLE hfile;
char Buffer[100];
DWORD dwByteWrite;
hfile=CreateFile("Result.txt",
GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
while(avg==0) Sleep(1);
ZeroMemory(Buffer,sizeof(Buffer));
sprintf(Buffer,"%f",avg);
WriteFile(hfile, Buffer, sizeof(Buffer), &dwByteWrite, NULL);
CloseHandle(hfile);
return 1;
}
int main(void)
{
DWORD h;
Thread_read_file_1=CreateThread(NULL,1,Read_file_1,NULL,0,&h);
Thread_read_file_2=CreateThread(NULL,1,Read_file_2,NULL,0,&h);
WaitForSingleObject(Thread_read_file_1, INFINITE);
WaitForSingleObject(Thread_read_file_2, INFINITE);
Thread_1=CreateThread(NULL,1,Thread_One,NULL,0,&h);
Thread_2=CreateThread(NULL,1,Thread_Two,NULL,0,&h);
Thread_write=CreateThread(NULL,1,Write,NULL,0,&h);
WaitForSingleObject(Thread_write, INFINITE);
printf("x:\n");
for(int i=0;i<1;i++)
{
for(int j=0;j<9;j++)
printf("%d ",x[i][j]);
printf("\n");
}
printf("xT:\n");
for(int i=0;i<9;i++)
{
for(int j=0;j<1;j++)
printf("%d ",tMatrix[i][j]);
printf("\n");
}
printf("y:\n");
for(int i=0;i<1;i++)
{
for(int j=0;j<9;j++)
printf("%d ",y[i][j]);
printf("\n");
}
printf("Matrix:\n");
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d ",Matrix[i][j]);
printf("\n");
}
printf("avg:\n");
printf("%f",avg);
printf("\n");
CloseHandle(Thread_read_file_1);
CloseHandle(Thread_read_file_2);
CloseHandle(Thread_1);
CloseHandle(Thread_2);
CloseHandle(Thread_write);
fflush(stdin);
getchar();
return 0;
}
Тесты программы:
Выводы: получили навыки решения задач «поставщик – потребитель» с использованием асинхронного ввода/вывода. В данной лабораторной работе выполнение операции ввода/вывода происходит с ожиданием на объектах ядра. С помощью функции WaitForSingleObject происходит ожидание перевода события в сигнальное состояние, что означает завершение операции ввода/вывода.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.