Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
13
Добавлен:
19.02.2016
Размер:
117.25 Кб
Скачать

Міністерство освіти і науки України

Житомирський державний технологічний університет

ФІКТ

Кафедра ПЗОТ

Група ПІК-9

Лабораторна робота №7

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

Виконав : Оленюк О.О.

Перевірив : Власенко О.В.

Житомир

2012 р.

Завдання:

Потрібно написати дві програми, що будуть мати спільні дані. Одна буде сортувати дані в файлі, а інша відображати вміст цього файлу. Працювати будуть одночасно.

Код програми:

Перша програма:

#include <windows.h>

#include <ctime>

#include <stdio.h>

#include <time.h>

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

FILE* file;

int a[30];

char chisla[100];

char b[30][30];

char stroka[100];

int n=0;

int m=0;

int k;

int kol=0;

char *stroka2="";

DWORD dw=0;

HANDLE hmap;

//char* pstart;

int *pstart;

int j;

TCHAR szName[]=TEXT("Global\\MyFileMappingObject");

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

HANDLE fh = ::CreateFile(

TEXT("data.dat"),

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ,

NULL,

CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);

srand(time(NULL));

for(int i=0;i<30;i++){

a[i] = 10+ (rand() % 90);

}

for(int i=0;i<30;i++){

sprintf(stroka,"%s%d ",stroka,a[i]);

}

SetFilePointer(fh,0,0,FILE_END);

dw=strlen(stroka);

// WriteFile(fh,stroka,strlen(stroka),&dw,NULL);

WriteFile(fh,a,sizeof(a),&dw,NULL);

hmap = CreateFileMapping(

fh,

NULL,

PAGE_READWRITE,//|SEC_NOCACHE,

0,

0,

szName);

pstart = (int*) MapViewOfFile(

hmap,

FILE_MAP_READ|FILE_MAP_WRITE,

0,

0,

0);

static char szAppName[] = "HelloWin" ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ; //обьявления переменной wndclass,тоесть структуры, где будут описаны параметры нашего окна

wndclass.cbSize = sizeof (wndclass) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ; //задает параметры, что при изменении ширины или высоты окна окно будет перерисовываться

wndclass.lpfnWndProc = WndProc ; //устанавливает исполняемой функцию WndProc для всех окон, созданных на основе класса wndclass

wndclass.cbClsExtra = 0 ; //ustanavliv chislo baytov,kotoroe programma mozhet ispolsovat kak dopolnitelnoe prostrasntvo

wndclass.cbWndExtra = 0 ; //ustanavliv chislo baytov,kotoroe programma mozhet ispolsovat kak dopolnitelnoe prostrasntvo

wndclass.hInstance = hInstance ; //описатель экземпляра программы (который является одним из параметров WinMain),eto unikalnoe chislo,kotoroe identificiruet programmu v sisteme,generiruetsa avto

wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION) ;//устанавливают значок для всех окон, созданных на основе данного класса окна. Для получения описателя стандартного значка, вы вызываете LoadIcon, установив первый параметр в NULL. (При загрузке вашего собственного пользовательского значка, этот параметр должен быть установлен равным описателю экземпляра программы.)

wndclass.hCursor = LoadCursor (NULL,IDC_ARROW) ;//Функция LoadCursor загружает стандартный курсор IDC_ARROW и возвращает описатель курсора. Этот описатель присваивается полю hCursor структуры WNDCLASSEX. Когда курсор мыши оказывается в рабочей области окна, созданного на основе данного класса, он превращается в маленькую стрелку.

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//задает цвет фона рабочей области окон, созданных на основе данного класса

wndclass.lpszMenuName = NULL ;//задает меню класса окна

wndclass.lpszClassName = szAppName ;//классу должно быть присвоено имя. Для простой программы оно может быть просто именем программы, которым в нашем случае является строка "HelloWin", хранящаяся в переменной szAppName:

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;//устанавливают значок для всех окон, созданных на основе данного класса окна. Для получения описателя стандартного значка, вы вызываете LoadIcon, установив первый параметр в NULL. (При загрузке вашего собственного пользовательского значка, этот параметр должен быть установлен равным описателю экземпляра программы.)

RegisterClassEx (&wndclass) ;//регистрирует класс окна путем вызова функции RegisterClassEx. Единственным параметром функции является указатель на структуру WNDCLASSEX:

hwnd = CreateWindow (szAppName, // имя класса окна //Параметр с комментарием "имя класса окна" — szAppName содержит строку "HelloWin", являющуюся именем только что зарегистрированного класса окна. Таким образом, этот параметр связывает окно с классом окна.

"1 программа", // заголовок окна //название, которое будет выводиться сверху окна

WS_OVERLAPPEDWINDOW, // стиль окна //Окно, созданное нашей программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна справа на строке заголовка и рамкой окна. Это стандартный стиль окон, он называется WS_OVERLAPPEDWINDOW

CW_USEDEFAULT, // начальное положение по x //Параметры с комментариями "начальное положение по x" и "начальное положение по y" задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана. Устанавливая для этих параметров идентификатор CW_USEDEFAULT, мы сообщаем Windows, что хотим использовать для перекры-вающегося окна задаваемое по умолчанию начальное положение. (CW_USEDEFAULT задается равным 0x80000000.)

CW_USEDEFAULT, // начальное положение по y

CW_USEDEFAULT, // начальный размер по x //По умолчанию Windows располагает следующие друг за другом перекрывающиеся окна, равномерно отступая по горизонтали и вертикали от верхнего левого угла экрана. Примерно также задают ширину и высоту окна параметры с комментариями "начальный размер по x" и "начальный размер по y". CW_USEDEFAULT снова означает, что мы хотим, чтобы Windows использовала задаваемый по умолчанию размер окна.

CW_USEDEFAULT, // начальный размер по y

NULL, // описатель родительского окна //Параметр с комментарием "описатель родительского окна" устанавливается в NULL, поскольку у нашего окна отсутствует родительское окно. (Если между двумя окнами существует связь типа родительское-дочернее, дочернее окно всегда появляется только на поверхности родительского.)

NULL, // описатель меню окна //Параметр с комментарием "описатель меню окна" также установлен в NULL, поскольку у нашего окна нет меню.

hInstance, // описатель экземпляра программы //В параметр с комментарием "описатель экземпляра программы" помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain.

NULL) ; // параметры создания //установлен в NULL. При необходимости этот параметр используется в качестве указателя на какие-нибудь данные, на которые программа в дальнейшем могла бы ссылаться

ShowWindow (hwnd, iCmdShow) ; //Первым параметром является описатель только что созданного функцией CreateWindow окна. Вторым параметром является величина iCmdShow, пере-даваемая в качестве параметра функции WinMain. Он задает начальный вид окна на экране. Если iCmdShow имеет значение SW_SHOWNORMAL (т. е. 1), на экран выводится обычное окно. Если iCmdShow имеет значение SW_SHOWMINNOACTIVE (т. е. 7), то окно не выводится, а на панели задач появляются его имя и иконка.

UpdateWindow (hwnd) ; //вызывает затем перерисовку рабочей области. Для этого в оконную процедуру (функция WndProc в HELLOWIN.C) посылается сообщение WM_PAINT.

while (GetMessage (&msg, NULL, 0, 0)) //извлекает сообщение из очереди сообщений

{

TranslateMessage (&msg) ; //передает структуру msg обратно в Windows для преобразования какого-либо сообщения с клавиатуры

DispatchMessage (&msg) ; //также передает структуру msg обратно в Windows. Windows отправляет сообщение для его обработки соответствующей оконной процедуре — таким образом, Windows вызывает оконную процедуру. Такой оконной процедурой в HELLOWIN является функция WndProc. После того, как WndProc обработает сообщение, оно возвращается в Windows, которая все еще обслуживает вызов функции DispatchMessage.

//Когда Windows возвращает управление в программу HELLOWIN к следующему за вызовом DispatchMessage коду, цикл обработки сообщений в очередной раз возобновляет работу, вызывая GetMessage.

}

UnmapViewOfFile(pstart);

CloseHandle(hmap);

CloseHandle(fh);

return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) //Оконная процедура всегда определяется следующим образом, только имя WNDPROC можно поменять

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (iMsg)

{

case WM_CREATE :

return 0 ; //WndProc завершает обработку WM_CREATE с нулевым возвращаемым значением.

case WM_PAINT : //Сообщение WM_PAINT функция WndProc обрабатывает вторым. Это сообщение крайне важно для программирования под Windows. Оно сообщает программе, что часть или вся рабочая область окна недействительна (invalid), и ее следует перерисо-вать.

hdc = BeginPaint (hwnd, &ps) ; //Обработка сообщения WM_PAINT почти всегда начинается с вызова функции

GetClientRect (hwnd, &rect) ;//Первый параметр — это описатель окна программы. Второй параметр — это указа-тель на переменную rect, для которой в WndProc задан тип RECT.

TextOut(hdc,10,30,stroka,strlen(stroka));

TextOut(hdc,10,50,stroka2,strlen(stroka2));

EndPaint (hwnd, &ps) ; //заканчивается вызовом функции EndPaint:

//Функция EndPaint освобождает описатель контекста устройства, после чего его значение нельзя использовать.

return 0 ;

//Когда рабочая область становится недействительной (как это происходит при изменении размеров окна), WndProc получает новое сообщение WM_PAINT. Новый размер окна WndProc получает, вызвав функцию GetClientRect, и снова рисует текст в центре окна.

case WM_KEYDOWN:

if(wParam==VK_SPACE)

SetTimer(hwnd, 1, 500, NULL);

return 0;

case WM_TIMER:

n++;

/* if(n<100)

{

kol=0;

for(m=0;m<30;m++)

if(a[m]>a[m+1])

{

k=a[m];

a[m]=a[m+1];

a[m+1]=k;

kol++;

}

if(kol==0)

n=101;

}*/

if(n<100)

{

kol=0;

for(m=0;m<30;m++)

if(pstart[m]>pstart[m+1])

{

k=pstart[m];

pstart[m]=pstart[m+1];

pstart[m+1]=k;

kol++;

}

if(kol==0)

n=101;

}

else {

KillTimer(hwnd, 1);

stroka2="Программа закончила работу";

InvalidateRect(hwnd, NULL, TRUE);

return 0;

}

for(int i=0;i<strlen(stroka);i++)

stroka[i]=NULL;

/*for(int i=0;i<strlen(pstart);i++)

pstart[i]=NULL;

for(int i=0;i<30;i++){

sprintf(pstart,"%s%d ",pstart,a[i]);

}*/

//FlushViewOfFile(&pstart, sizeof(pstart));

/*for(int i=0;i<strlen(pstart);i++){

sprintf(stroka,"%s%c",stroka,pstart[i]);

}*/

MessageBeep (0) ;

InvalidateRect(hwnd, NULL, TRUE);

return 0;

case WM_DESTROY : //Это сообщение показывает, что Windows находится в процессе ликвидации окна в ответ на полученную от пользователя команду. Пользователь вызывает поступление этого сообщения, если щелкнет на кнопке Close, или выберет Close из системного меню программы, или нажмет <Alt>+<F4>.

KillTimer(hwnd, 1);

PostQuitMessage (0) ; //Эта функция ставит сообщение WM_QUIT в очередь сообщений программы. Как уже упоминалось, функция GetMessage возвращает ненулевое значение при любом сообщении, полученном из очереди сообщений за исключением WM_QUIT. Когда GetMessage получает сообщение WM_QUIT, функция возвращает 0. Это заставляет WinMain прервать цикл обработки сообщений и выйти в систему, закончив програм-му.

return 0 ;

}

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

}

Друга програма:

#include <windows.h>

#include <stdio.h>

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

char stroka[100];

FILE* file;

int a[30];

HANDLE hmap;

//char* pstart;

int *pstart;

TCHAR szName[]=TEXT("Global\\MyFileMappingObject");

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

static char szAppName[] = "HelloWin" ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ; //обьявления переменной wndclass,тоесть структуры, где будут описаны параметры нашего окна

/*HANDLE fh = ::CreateFile(

TEXT("C:\\Users\\Александр\\Documents\\Visual Studio 2010\\Projects\\системка лаба 8 вариант 2\\1 программа сортировка\\системка лаба 4 новое\\data.dat"),

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ,

NULL,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);*/

hmap= OpenFileMapping(

FILE_MAP_ALL_ACCESS,

FALSE,

szName);

pstart = (int*) MapViewOfFile(

hmap,

FILE_MAP_READ|FILE_MAP_WRITE,

0,

0,

0);

wndclass.cbSize = sizeof (wndclass) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ; //задает параметры, что при изменении ширины или высоты окна окно будет перерисовываться

wndclass.lpfnWndProc = WndProc ; //устанавливает исполняемой функцию WndProc для всех окон, созданных на основе класса wndclass

wndclass.cbClsExtra = 0 ; //ustanavliv chislo baytov,kotoroe programma mozhet ispolsovat kak dopolnitelnoe prostrasntvo

wndclass.cbWndExtra = 0 ; //ustanavliv chislo baytov,kotoroe programma mozhet ispolsovat kak dopolnitelnoe prostrasntvo

wndclass.hInstance = hInstance ; //описатель экземпляра программы (который является одним из параметров WinMain),eto unikalnoe chislo,kotoroe identificiruet programmu v sisteme,generiruetsa avto

wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION) ;//устанавливают значок для всех окон, созданных на основе данного класса окна. Для получения описателя стандартного значка, вы вызываете LoadIcon, установив первый параметр в NULL. (При загрузке вашего собственного пользовательского значка, этот параметр должен быть установлен равным описателю экземпляра программы.)

wndclass.hCursor = LoadCursor (NULL,IDC_ARROW) ;//Функция LoadCursor загружает стандартный курсор IDC_ARROW и возвращает описатель курсора. Этот описатель присваивается полю hCursor структуры WNDCLASSEX. Когда курсор мыши оказывается в рабочей области окна, созданного на основе данного класса, он превращается в маленькую стрелку.

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//задает цвет фона рабочей области окон, созданных на основе данного класса

wndclass.lpszMenuName = NULL ;//задает меню класса окна

wndclass.lpszClassName = szAppName ;//классу должно быть присвоено имя. Для простой программы оно может быть просто именем программы, которым в нашем случае является строка "HelloWin", хранящаяся в переменной szAppName:

wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;//устанавливают значок для всех окон, созданных на основе данного класса окна. Для получения описателя стандартного значка, вы вызываете LoadIcon, установив первый параметр в NULL. (При загрузке вашего собственного пользовательского значка, этот параметр должен быть установлен равным описателю экземпляра программы.)

RegisterClassEx (&wndclass) ;//регистрирует класс окна путем вызова функции RegisterClassEx. Единственным параметром функции является указатель на структуру WNDCLASSEX:

hwnd = CreateWindow (szAppName, // имя класса окна //Параметр с комментарием "имя класса окна" — szAppName содержит строку "HelloWin", являющуюся именем только что зарегистрированного класса окна. Таким образом, этот параметр связывает окно с классом окна.

"2 программа", // заголовок окна //название, которое будет выводиться сверху окна

WS_OVERLAPPEDWINDOW, // стиль окна //Окно, созданное нашей программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна справа на строке заголовка и рамкой окна. Это стандартный стиль окон, он называется WS_OVERLAPPEDWINDOW

CW_USEDEFAULT, // начальное положение по x //Параметры с комментариями "начальное положение по x" и "начальное положение по y" задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана. Устанавливая для этих параметров идентификатор CW_USEDEFAULT, мы сообщаем Windows, что хотим использовать для перекры-вающегося окна задаваемое по умолчанию начальное положение. (CW_USEDEFAULT задается равным 0x80000000.)

CW_USEDEFAULT, // начальное положение по y

CW_USEDEFAULT, // начальный размер по x //По умолчанию Windows располагает следующие друг за другом перекрывающиеся окна, равномерно отступая по горизонтали и вертикали от верхнего левого угла экрана. Примерно также задают ширину и высоту окна параметры с комментариями "начальный размер по x" и "начальный размер по y". CW_USEDEFAULT снова означает, что мы хотим, чтобы Windows использовала задаваемый по умолчанию размер окна.

CW_USEDEFAULT, // начальный размер по y

NULL, // описатель родительского окна //Параметр с комментарием "описатель родительского окна" устанавливается в NULL, поскольку у нашего окна отсутствует родительское окно. (Если между двумя окнами существует связь типа родительское-дочернее, дочернее окно всегда появляется только на поверхности родительского.)

NULL, // описатель меню окна //Параметр с комментарием "описатель меню окна" также установлен в NULL, поскольку у нашего окна нет меню.

hInstance, // описатель экземпляра программы //В параметр с комментарием "описатель экземпляра программы" помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain.

NULL) ; // параметры создания //установлен в NULL. При необходимости этот параметр используется в качестве указателя на какие-нибудь данные, на которые программа в дальнейшем могла бы ссылаться

ShowWindow (hwnd, iCmdShow) ; //Первым параметром является описатель только что созданного функцией CreateWindow окна. Вторым параметром является величина iCmdShow, пере-даваемая в качестве параметра функции WinMain. Он задает начальный вид окна на экране. Если iCmdShow имеет значение SW_SHOWNORMAL (т. е. 1), на экран выводится обычное окно. Если iCmdShow имеет значение SW_SHOWMINNOACTIVE (т. е. 7), то окно не выводится, а на панели задач появляются его имя и иконка.

UpdateWindow (hwnd) ; //вызывает затем перерисовку рабочей области. Для этого в оконную процедуру (функция WndProc в HELLOWIN.C) посылается сообщение WM_PAINT.

while (GetMessage (&msg, NULL, 0, 0)) //извлекает сообщение из очереди сообщений

{

TranslateMessage (&msg) ; //передает структуру msg обратно в Windows для преобразования какого-либо сообщения с клавиатуры

DispatchMessage (&msg) ; //также передает структуру msg обратно в Windows. Windows отправляет сообщение для его обработки соответствующей оконной процедуре — таким образом, Windows вызывает оконную процедуру. Такой оконной процедурой в HELLOWIN является функция WndProc. После того, как WndProc обработает сообщение, оно возвращается в Windows, которая все еще обслуживает вызов функции DispatchMessage.

//Когда Windows возвращает управление в программу HELLOWIN к следующему за вызовом DispatchMessage коду, цикл обработки сообщений в очередной раз возобновляет работу, вызывая GetMessage.

}

UnmapViewOfFile(pstart);

CloseHandle(hmap);

// CloseHandle(fh);

return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) //Оконная процедура всегда определяется следующим образом, только имя WNDPROC можно поменять

{

HDC hdc ;

PAINTSTRUCT ps ;

RECT rect ;

switch (iMsg)

{

case WM_CREATE :

SetTimer(hwnd, 1, 500, NULL);

return 0 ; //WndProc завершает обработку WM_CREATE с нулевым возвращаемым значением.

case WM_PAINT : //Сообщение WM_PAINT функция WndProc обрабатывает вторым. Это сообщение крайне важно для программирования под Windows. Оно сообщает программе, что часть или вся рабочая область окна недействительна (invalid), и ее следует перерисо-вать.

hdc = BeginPaint (hwnd, &ps) ; //Обработка сообщения WM_PAINT почти всегда начинается с вызова функции

GetClientRect (hwnd, &rect) ;//Первый параметр — это описатель окна программы. Второй параметр — это указа-тель на переменную rect, для которой в WndProc задан тип RECT.

/*for(int i=0;i<strlen(stroka);i++)

stroka[i]=NULL;*/

for(int i=0;i<30;i++){

sprintf(stroka,"%d ",pstart[i]);

TextOut(hdc,10,30+i*13,stroka,strlen(stroka));}

//TextOut(hdc,10,30,pstart,strlen(pstart));

EndPaint (hwnd, &ps) ; //заканчивается вызовом функции EndPaint:

return 0; //Когда рабочая область становится недействительной (как это происходит при изменении размеров окна), WndProc получает новое сообщение WM_PAINT. Новый размер окна WndProc получает, вызвав функцию GetClientRect, и снова рисует текст в центре окна.

case WM_TIMER:

InvalidateRect(hwnd, NULL, TRUE);

return 0;

case WM_DESTROY : //Это сообщение показывает, что Windows находится в процессе ликвидации окна в ответ на полученную от пользователя команду. Пользователь вызывает поступление этого сообщения, если щелкнет на кнопке Close, или выберет Close из системного меню программы, или нажмет <Alt>+<F4>.

KillTimer(hwnd, 1);

PostQuitMessage (0) ; //Эта функция ставит сообщение WM_QUIT в очередь сообщений программы. Как уже упоминалось, функция GetMessage возвращает ненулевое значение при любом сообщении, полученном из очереди сообщений за исключением WM_QUIT. Когда GetMessage получает сообщение WM_QUIT, функция возвращает 0. Это заставляет WinMain прервать цикл обработки сообщений и выйти в систему, закончив програм-му.

return 0 ;

}

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

}

Соседние файлы в папке СПЗ отчеты (Власенко О.В.)