Міністерствоосвіти і науки України
Житомирський державний технологічний університет
ФІКТ
КафедраПЗОТ
ГрупаПІ-39
Лабораторнаяробота №8
покурсу
Системноепрограммирование
натему
Процессыи потоки
г./>Житомир
2011р.
Задание
Необходимо написать двепрограммы, которые будут иметь общие данные.
Существует несколькомеханизмов реализации общего доступа к данным разных процессов. Воспользуемсяодним из них, наиболее удобным – проецированием файла в память. Одна программабудет сортировать данные в файле, а другая отображать содержимое этого файла.Работать оба процесса будут одновременно.
программамассив процессХод работы
Создайте файл data.dat.В нем записаны числа, сгенерированные случайным образом. Количество чисел –20-30 штук. Диапазон значений: от 10 до 100. (Это именно числа, а не символьныестроки хранящие ASCII коды цифр!!!)
Программа №1.«Сортировка данных»
1. Беремза основу программу лаб.раб №4.
2. Включаемобработку события нажатия клавиши, и отслеживаем в нем нажатие пробела. Еслипользователь нажал пробел, значит начинаем сортировку данных.
3. Выполняемпроецирование файла в память. Используем для этого созданный файл data.dat.В результате получим доступ к данным как к обычному одномерному массиву.
4. Выполняемсортировку массива, любым из методов сортировки. Вставьте 1-но секундную задержкудля каждой итерации сортировки массива, это позволит потом наглядней увидетьпроцесс сортировки.
5. Поокончанию сортировки, программа выводит в окно, строку «Работа завершена».
Программа №1. «Выводфайла данных в окно»
1. Беремза основу программу лаб.раб №4.
2. Выполняемпроецирование файла в память. Используем для этого созданный файл data.dat.В результате получим доступ к данным как к обычному одномерному массиву. Этотже файл проецирует в память предыдущая программа.
3. Создаемтаймер на 0.5 секунды. При получении сообщения от таймера, выполняем выводвсего массива в окно. Предусмотрите корректный перевывод данных в окно, безналожений. В окно выводим не числа из массива, а строки одного и того жесимвола, например «*», в количестве равном числу из массива.
Запускаем на выполнениеобе программы одновременно. Когда вторая программа запустилась и выполняетвывод данных в окно (выводит пока одну и туже картинку каждые пол секунды),нажимаем пробел в первой программе и она начинает сортировать массив. При этом,так как они данные берут из одного и того же файла (обе проецировали его себе впамять), то первая вносит изменения переставляя данные при сортировке, а втораявыводит из себе в окно и мы видим ход процесса сортировки. Временную задержку впервой программе можно при надобности увеличить.
Эти две программыдемонстрируют возможность организации общего доступа процессов к одним и тем жеданным. Так же демонстрируется механизм проецирования файла в память, как одиниз наилучших методов доступа к файлу.КодпрограммыПрограма №1
LRESULTCALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
HANDLEFileMappingHandle, FileHandle, MutexHandle;
HINSTANCEexec;
int*Image;
intWINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTRszCmdLine, int iCmdShow)
{
staticchar szAppName[] = «FileImageViewer» ;
HWNDhwnd ;
MSGmsg ;
WNDCLASSEXwndclass ;
wndclass.cbSize= sizeof (wndclass) ;
wndclass.style= CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra= 0 ;
wndclass.cbWndExtra= 0 ;
wndclass.hInstance= hInstance ;
wndclass.hIcon= LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName= NULL ;
wndclass.lpszClassName= szAppName ;
wndclass.hIconSm= LoadIcon (NULL, IDI_APPLICATION) ;
RegisterClassEx(&wndclass) ;
hwnd= CreateWindow (szAppName,
«FileImageViewer»,
WS_OVERLAPPEDWINDOW,
200,
10,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow) ;
UpdateWindow(hwnd) ;
while(GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
returnmsg.wParam ;
}
LRESULTCALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDChdc ;
PAINTSTRUCTps ;
RECTrect ;
switch(iMsg)
{
inti;
caseWM_CREATE:
FileHandle=CreateFile(".\\..\\mass.dat",GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,NULL);
if(FileHandle==NULL)
{
MessageBox(hwnd,«Невозможно открыть файл», «Ошибка», MB_ICONWARNING);
exit(1);
}
srand((unsigned)time(NULL));
str="";
buf.push_back(str);
intt[26];
for(i=0;i
{
t[i]=rand()%100;
if(t[i]
t[i]+=10;
}
unsignedlong z;
exec=ShellExecute(hwnd,NULL, ".\\..\\SysLab8_2\\Debug\\SysLab8_2.exe", NULL,
".\\SysLab8_2\\Debug\\",SW_SHOWNORMAL);
SetTimer(hwnd,NULL, 500, NULL);
WriteFile(FileHandle,t, sizeof(int)*26, &z, NULL);
FileMappingHandle=CreateFileMapping(FileHandle,NULL, PAGE_READWRITE, 0, 0, «mass»);
if(FileMappingHandle==NULL)
{
MessageBox(hwnd,«Ошибка создания дескриптора проэцирования», «Ошибка»,MB_ICONWARNING);
exit(1);
}
Image=(int*)MapViewOfFile(FileMappingHandle,FILE_MAP_READ, 0, 0, 0);
if(Image==NULL)
{
MessageBox(hwnd,«Ошибка проэцирования файла», «Ошибка», MB_ICONWARNING);
exit(1);
}
MutexHandle=CreateMutex(0,FALSE,«massmutex»);
if(MutexHandle==NULL)
{
MessageBox(hwnd,«Невозможно создать мутекс», «Ошибка», MB_ICONWARNING);
exit(1);
}
return0 ;
caseWM_PAINT:
hdc= BeginPaint (hwnd, &ps) ;
GetClientRect(hwnd, &rect) ;
for(i=1;(unsigned)i
TextOut(hdc,10, i*15, buf[i].c_str(), buf[i].length());
EndPaint(hwnd, &ps) ;
return0 ;
caseWM_TIMER:
__try
{
WaitForSingleObject(MutexHandle,INFINITE);
buf.clear();
str="";
buf.push_back(str);
for(i=1;i
{
for(intj=0; j
str+="*";
buf.push_back(str);
str="";
}
}
__finally
{
ReleaseMutex(MutexHandle);
}
InvalidateRect(hwnd, NULL, TRUE) ;
return0;
caseWM_DESTROY :
UnmapViewOfFile(Image);
CloseHandle(FileHandle);
CloseHandle(MutexHandle);
PostQuitMessage(0) ;
return0 ;
}
returnDefWindowProc (hwnd, iMsg, wParam, lParam) ;
}Програма №2
LRESULTCALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
HANDLEFileMappingHandle, FileHandle, MutexHandle;
LPVOIDImage;
int*a;
std::stringstr="";
intWINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTRszCmdLine, int iCmdShow)
{
staticchar szAppName[] = «FileImageSorter» ;
HWNDhwnd ;
MSGmsg ;
WNDCLASSEXwndclass ;
wndclass.cbSize= sizeof (wndclass) ;
wndclass.style= CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc= WndProc ;
wndclass.cbClsExtra= 0 ;
wndclass.cbWndExtra= 0 ;
wndclass.hInstance= hInstance ;
wndclass.hIcon= LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName= NULL ;
wndclass.lpszClassName= szAppName ;
wndclass.hIconSm= LoadIcon (NULL, IDI_APPLICATION) ;
RegisterClassEx(&wndclass) ;
hwnd= CreateWindow (szAppName,
«FileImageSorter»,
WS_OVERLAPPEDWINDOW,
10,
10,
170,
80,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow) ;
UpdateWindow(hwnd) ;
while(GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage(&msg) ;
DispatchMessage(&msg) ;
}
returnmsg.wParam ;
}
LRESULTCALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDChdc ;
PAINTSTRUCTps ;
RECTrect ;
switch(iMsg)
{
caseWM_CREATE:
return0 ;
caseWM_PAINT:
hdc= BeginPaint (hwnd, &ps) ;
GetClientRect(hwnd, &rect) ;
TextOut(hdc,10,10,str.c_str(),str.size());
EndPaint(hwnd, &ps) ;
return0 ;
caseWM_KEYDOWN:
if(wParam==VK_SPACE)
{
FileMappingHandle=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE, «mass»);
if(FileMappingHandle==NULL)
{
MessageBox(hwnd,«Ошибка создания дескриптора проэцирования», «Ошибка»,MB_ICONWARNING);
exit(1);
}
Image=MapViewOfFile(FileMappingHandle,FILE_MAP_WRITE, 0, 0, 0);
if(Image==NULL)
{
MessageBox(hwnd,«Ошибка проэцирования файла», «Ошибка», MB_ICONWARNING);
exit(1);
}
MutexHandle=OpenMutex(MUTEX_ALL_ACCESS,FALSE, «massmutex»);
if(MutexHandle==NULL)
{
MessageBox(hwnd,«Невозможно создать мутекс», «Ошибка», MB_ICONWARNING);
exit(1);
}
str=«Работаначата...»;
InvalidateRect(hwnd, NULL, TRUE) ;
__try
{
a=(int *)Image;
longi, j;
intx;
for(i=1; i
for(j = 26-1; j > i; j-- )
{
Sleep(200);
__try
{
WaitForSingleObject(MutexHandle,INFINITE);
if( a[j-1] > a[j] )
{
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
if(i==3)
exit(1);
}
}
__finally
{
ReleaseMutex(MutexHandle);
}
}
}
__finally
{
str=«Работазакончена»;
UnmapViewOfFile(Image);
CloseHandle(FileHandle);
CloseHandle(MutexHandle);
}
}
InvalidateRect(hwnd, NULL, TRUE) ;
return0;
caseWM_DESTROY:
UnmapViewOfFile(Image);
CloseHandle(FileHandle);
CloseHandle(MutexHandle);
PostQuitMessage(0) ;
return0 ;
}
returnDefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
Вывод
Следовательно, во времявыполнения данной лабораторной работы были получены практические навыки работыс многопоточным программированием. Был создан проект, который включает в себе двепрограммы: одна программа – сортирует массив из файла, а другая выводит на экрансодержание этого файла. Обе программы используют один и тот же файл в одинмомент времени.