Помощь в написании студенческих работ
Антистрессовый сервис

Процессы и потоки

Лабораторная работаПомощь в написанииУзнать стоимостьмоей работы

Следовательно, во время выполнения данной лабораторной работы были получены практические навыки работы с многопоточным программированием. Был создан проект, который включает в себе две программы: одна программа — сортирует массив из файла, а другая выводит на экран содержание этого файла. Обе программы используют один и тот же файл в один момент времени. Существует несколько механизмов реализации… Читать ещё >

Процессы и потоки (реферат, курсовая, диплом, контрольная)

Міністерство освіти і науки України Житомирський державний технологічний університет ФІКТ Кафедра ПЗОТ Група ПІ-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

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

HANDLE FileMappingHandle, FileHandle, MutexHandle;

HINSTANCE exec;

int* Image;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static char szAppName[] = «FileImageViewer» ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ;

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) ;

}

return msg. wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (iMsg)

{

int i;

case WM_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);

int t[26];

for (i=0; i<26; i++)

{

t[i]=rand ()%100;

if (t[i]<10)

t[i]+=10;

}

unsigned long z;

exec=ShellExecute (hwnd, NULL, «.\.\SysLab82\Debug\SysLab82.exe», NULL,

" .\SysLab82\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);

}

return 0 ;

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps) ;

GetClientRect (hwnd, &rect) ;

for (i=1; (unsigned)i<(unsigned)buf.size (); i++)

TextOut (hdc, 10, i*15, buf[i]. c_str (), buf[i]. length ());

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_TIMER:

__try

{

WaitForSingleObject (MutexHandle, INFINITE);

buf.clear ();

str="" ;

buf.push_back (str);

for (i=1; i<26; i++)

{

for (int j=0; j<*(Image+i); j++)

str+="*" ;

buf.push_back (str);

str="" ;

}

}

__finally

{

ReleaseMutex (MutexHandle);

}

InvalidateRect (hwnd, NULL, TRUE) ;

return 0;

case WM_DESTROY :

UnmapViewOfFile (Image);

CloseHandle (FileHandle);

CloseHandle (MutexHandle);

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

}

Програма № 2

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

HANDLE FileMappingHandle, FileHandle, MutexHandle;

LPVOID Image;

int *a;

std:string str="" ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static char szAppName[] = «FileImageSorter» ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ;

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) ;

}

return msg. wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (iMsg)

{

case WM_CREATE:

return 0 ;

case WM_PAINT:

hdc = BeginPaint (hwnd, &ps) ;

GetClientRect (hwnd, &rect) ;

TextOut (hdc, 10,10,str.c_str (), str. size ());

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_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;

long i, j;

int x;

for (i=1; i < 26; 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) ;

return 0;

case WM_DESTROY:

UnmapViewOfFile (Image);

CloseHandle (FileHandle);

CloseHandle (MutexHandle);

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

}

Вывод

Следовательно, во время выполнения данной лабораторной работы были получены практические навыки работы с многопоточным программированием. Был создан проект, который включает в себе две программы: одна программа — сортирует массив из файла, а другая выводит на экран содержание этого файла. Обе программы используют один и тот же файл в один момент времени.

Показать весь текст
Заполнить форму текущей работой