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