̳í³ñòåðñòâî îñâ³òè ³ íàóêè Óêðà¿íè
Æèòîìèðñüêèé äåðæàâíèé òåõíîëîã³÷íèé óí³âåðñèòåò
Ô²ÊÒ
Êàôåäðà ÏÇÎÒ
Ãðóïà ϲ-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 ñåêóíäû. Ïðè ïîëó÷åíèè ñîîáùåíèÿ îò òàéìåðà, âûïîëíÿåì âûâîä âñåãî ìàññèâà â îêíî. Ïðåäóñìîòðèòå êîððåêòíûé ïåðåâûâîä äàííûõ â îêíî, áåç íàëîæåíèé.  îêíî âûâîäèì íå ÷èñëà èç ìàññèâà, à ñòðîêè îäíîãî è òîãî æå ñèìâîëà, íàïðèìåð «*», â êîëè÷åñòâå ðàâíîì ÷èñëó èç ìàññèâà.
Çàïóñêàåì íà âûïîëíåíèå îáå ïðîãðàììû îäíîâðåìåííî. Êîãäà âòîðàÿ ïðîãðàììà çàïóñòèëàñü è âûïîëíÿåò âûâîä äàííûõ â îêíî (âûâîäèò ïîêà îäíó è òóæå êàðòèíêó êàæäûå ïîë ñåêóíäû), íàæèìàåì ïðîáåë â ïåðâîé ïðîãðàììå è îíà íà÷èíàåò ñîðòèðîâàòü ìàññèâ. Ïðè ýòîì, òàê êàê îíè äàííûå áåðóò èç îäíîãî è òîãî æå ôàéëà (îáå ïðîåöèðîâàëè åãî ñåáå â ïàìÿòü), òî ïåðâàÿ âíîñèò èçìåíåíèÿ ïåðåñòàâëÿÿ äàííûå ïðè ñîðòèðîâêå, à âòîðàÿ âûâîäèò èç ñåáå â îêíî è ìû âèäèì õîä ïðîöåññà ñîðòèðîâêè. Âðåìåííóþ çàäåðæêó â ïåðâîé ïðîãðàììå ìîæíî ïðè íàäîáíîñòè óâåëè÷èòü.
Ýòè äâå ïðîãðàììû äåìîíñòðèðóþò âîçìîæíîñòü îðãàíèçàöèè îáùåãî äîñòóïà ïðîöåññîâ ê îäíèì è òåì æå äàííûì. Òàê æå äåìîíñòðèðóåòñÿ ìåõàíèçì ïðîåöèðîâàíèÿ ôàéëà â ïàìÿòü, êàê îäèí èç íàèëó÷øèõ ìåòîäîâ äîñòóïà ê ôàéëó.
Êîä ïðîãðàììû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, ".\\..\\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);
}
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) ;
}
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) ;
}
Ñëåäîâàòåëüíî, âî âðåìÿ âûïîëíåíèÿ äàííîé ëàáîðàòîðíîé ðàáîòû áûëè ïîëó÷åíû ïðàêòè÷åñêèå íàâûêè ðàáîòû ñ ìíîãîïîòî÷íûì ïðîãðàììèðîâàíèåì. Áûë ñîçäàí ïðîåêò, êîòîðûé âêëþ÷àåò â ñåáå äâå ïðîãðàììû: îäíà ïðîãðàììà – ñîðòèðóåò ìàññèâ èç ôàéëà, à äðóãàÿ âûâîäèò íà ýêðàí ñîäåðæàíèå ýòîãî ôàéëà. Îáå ïðîãðàììû èñïîëüçóþò îäèí è òîò æå ôàéë â îäèí ìîìåíò âðåìåíè.