Èíôîðìàòèêà, ïðîãðàììèðîâàíèå: Ïðîöåññû è ïîòîêè, Ëàáîðàòîðíàÿ ðàáîòà

̳í³ñòåðñòâî îñâ³òè ³ íàóêè Óêðà¿íè

Æèòîìèðñüêèé äåðæàâíèé òåõíîëîã³÷íèé óí³âåðñèòåò

Ô²ÊÒ

Êàôåäðà ÏÇÎÒ

Ãðóïà ϲ-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, ".\\..\\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) ;

}

Ïðîãðàìà ¹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) ;

}


Âûâîä

Ñëåäîâàòåëüíî, âî âðåìÿ âûïîëíåíèÿ äàííîé ëàáîðàòîðíîé ðàáîòû áûëè ïîëó÷åíû ïðàêòè÷åñêèå íàâûêè ðàáîòû ñ ìíîãîïîòî÷íûì ïðîãðàììèðîâàíèåì. Áûë ñîçäàí ïðîåêò, êîòîðûé âêëþ÷àåò â ñåáå äâå ïðîãðàììû: îäíà ïðîãðàììà – ñîðòèðóåò ìàññèâ èç ôàéëà, à äðóãàÿ âûâîäèò íà ýêðàí ñîäåðæàíèå ýòîãî ôàéëà. Îáå ïðîãðàììû èñïîëüçóþò îäèí è òîò æå ôàéë â îäèí ìîìåíò âðåìåíè.


Åùå èç ðàçäåëà Èíôîðìàòèêà, ïðîãðàììèðîâàíèå:


 Ýòî èíòåðåñíî
 Ðåêëàìà
 Ïîèñê ðåôåðàòîâ
 
 Àôîðèçì
- Âû ïîñìîòðèòå, ÷òî òâîðèòñÿ! Êðóãîì ñåêñ, ýðîòèêà, ïîðíîãðàôèÿ! Ñìîòðåòü ïðîòèâíî…! À ó÷àñòâîâàòü ïðèÿòíî.
 Ãîðîñêîï
Ãîðîñêîïû
 Ñ÷¸ò÷èêè
bigmir)net TOP 100