Написание программы

Автор работы: Пользователь скрыл имя, 26 Декабря 2010 в 23:52, задача

Описание

На круглом столе находятся k тарелок с едой, между которыми лежит столько же вилок, k=4,…,7. В комнате имеется k философов, чередующих философские размышления с принятием пищи. За каждым философом закреплена своя тарелка; для еды философу нужны две вилки, причем он может использовать только вилки, примыкающие к его тарелке. Требуется так синхронизировать философов, чтобы каждый из них мог получить за ограниченное время доступ к своей тарелке. Предполагается, что длительности еды и размышлений философа конечны, но заранее недетерминированы (могут быть выбраны случайным образом из некоторого диапазона).

Содержание

1 Постановка задачи 3
2 Выводы 4
Приложение А Листинг программы 5
Приложение Б Пример протокола выполнения программы 13

Работа состоит из  1 файл

Отчет-ПП-2я.doc

— 130.50 Кб (Скачать документ)

                        }

                        else

                        {

                              if (TryEnterCriticalSection(&(vilki[id+1])) == 0) //если не удалось взять вторую вилку - кладем первую

                              {

                                    LeaveCriticalSection(&(vilki[id]) );

                                    swprintf(str, L"Философ %s положил вилку %d", id_str, id); 

                                    EnterCriticalSection(&main_sect);

                                    SendMessage(hTable, LB_ADDSTRING, 0, (LPARAM)&str);

                                    LeaveCriticalSection(&main_sect);

                              }

                              else

                              {

                                    swprintf(str, L"Философ %s взял вилку %d", id_str, id+1); 

                                    EnterCriticalSection(&main_sect);

                                    SendMessage(hTable, LB_ADDSTRING, 0, (LPARAM)&str);

                                    LeaveCriticalSection(&main_sect); 

                                    GetLocalTime(&sys_time);

                                    Y[id] = 10;

                                    InvalidateRect(hWnd, &rect, true);

                                    Sleep(time);//едим

                                    {

                                          Y[id] = 0;

                                          InvalidateRect(hWnd, &rect, true);

                                          GetLocalTime(&sys_time1);

                                          GetTimeFormat(LOCALE_SYSTEM_DEFAULT, NULL, &sys_time, L"HH':'mm':'ss':'ms", str_time, 200);

                                          GetTimeFormat(LOCALE_SYSTEM_DEFAULT, NULL, &sys_time1, L"HH':'mm':'ss':'ms", str_time1, 200);

                                          swprintf(str, L"(%s) Философ %s кушает (%s ms)",str_time, id_str, str_time1); 

                                          EnterCriticalSection(&main_sect);

                                          SendMessage(hTable, LB_ADDSTRING, 0, (LPARAM)&str);

                                          LeaveCriticalSection(&main_sect); 

                                          eated = true; 

                                    }

                                    LeaveCriticalSection(&vilki[id]);  //кладем обе вилки

                                    swprintf(str, L"Философ %s положил вилку %d", id_str, id); 

                                    EnterCriticalSection(&main_sect);

                                    SendMessage(hTable, LB_ADDSTRING, 0, (LPARAM)&str);

                                    LeaveCriticalSection(&main_sect); 

                                    LeaveCriticalSection(&vilki[id+1]);

                                    swprintf(str, L"Философ %s положил вилку %d", id_str, id+1); 

                                    EnterCriticalSection(&main_sect);

                                    SendMessage(hTable, LB_ADDSTRING, 0, (LPARAM)&str);

                                    LeaveCriticalSection(&main_sect);

                              }

                        } 

                  }

                  time = (rand()*wait_time)/RAND_MAX;

                  GetLocalTime(&sys_time);

                  Sleep(time);//ждем

                  GetLocalTime(&sys_time1);

                  GetTimeFormat(LOCALE_SYSTEM_DEFAULT, NULL, &sys_time, L"HH':'mm':'ss':'ms", str_time, 200);

                  GetTimeFormat(LOCALE_SYSTEM_DEFAULT, NULL, &sys_time1, L"HH':'mm':'ss':'ms", str_time1, 200);

                  swprintf(str, L"(%s) Философ %s ждет (%s ms)",str_time, id_str, str_time1); 

                  EnterCriticalSection(&main_sect);

                  SendMessage(hTable, LB_ADDSTRING, 0, (LPARAM)&str);

                  LeaveCriticalSection(&main_sect);

            } 

      } 

} 
 

int APIENTRY _tWinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPTSTR    lpCmdLine,

                     int       nCmdShow)

{

      UNREFERENCED_PARAMETER(hPrevInstance);

      UNREFERENCED_PARAMETER(lpCmdLine); 

  // TODO: Place code here.

      MSG msg;

      HACCEL hAccelTable; 

      // Initialize global strings

      LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

      LoadString(hInstance, IDC_PP2, szWindowClass, MAX_LOADSTRING);

      MyRegisterClass(hInstance); 

      // Perform application initialization:

      if (!InitInstance (hInstance, nCmdShow))

      {

            return FALSE;

      } 

      hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PP2)); 

      // Main message loop:

      while (GetMessage(&msg, NULL, 0, 0))

      {

            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

            {

                  TranslateMessage(&msg);

                  DispatchMessage(&msg);

            }

      } 

      return (int) msg.wParam;

} 

ATOM MyRegisterClass(HINSTANCE hInstance)

{

      WNDCLASSEX wcex; 

      wcex.cbSize = sizeof(WNDCLASSEX); 

      wcex.style   = CS_HREDRAW | CS_VREDRAW;

      wcex.lpfnWndProc = WndProc;

      wcex.cbClsExtra  = 0;

      wcex.cbWndExtra  = 0;

      wcex.hInstance  = hInstance;

      wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PP2));

      wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

      wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

      wcex.lpszMenuName = MAKEINTRESOURCE(IDC_PP2);

      wcex.lpszClassName = szWindowClass;

      wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 

      return RegisterClassEx(&wcex);

} 

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{ 

   hInst = hInstance; // Store instance handle in our global variable 

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

   if (!hWnd)

   {

      return FALSE;

   } 
 

    LOGFONT lf;

  

   lf.lfCharSet = DEFAULT_CHARSET;

      lf.lfPitchAndFamily = DEFAULT_PITCH;

      wcscpy_s(lf.lfFaceName, L"Arial");

      lf.lfHeight = -15;

      lf.lfStrikeOut = 0;

      lf.lfUnderline = 0;

      lf.lfQuality = DEFAULT_QUALITY;

      lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;

      lf.lfWeight = FW_NORMAL;

      lf.lfWidth = 6;

      lf.lfOrientation = lf.lfEscapement = 0;

      lf.lfItalic = FALSE;

      hFont = CreateFontIndirect(&lf); 

      hEdCount = CreateWindow(L"Edit", L"5", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_NUMBER,

         100, 50, 100, 22, hWnd, NULL, hInstance, NULL);

   SendMessage(hEdCount, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE); 

   hButStart = CreateWindow(L"Button", L"Запустить", WS_VISIBLE | WS_CHILD,

         100, 100, 100, 22, hWnd, (HMENU)ID_START, hInstance, NULL);

   SendMessage(hButStart, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE); 
 

   hTable = CreateWindow(L"Listbox", L"",  WS_CHILD | WS_VISIBLE | WS_BORDER | LBS_HASSTRINGS | LBS_NOSEL | WS_VSCROLL,

         250, 50, 500, 300, hWnd, NULL, hInstance, NULL); 

   SendMessage(hTable, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE); 

   InitializeCriticalSection(&main_sect); 
 

   ShowWindow(hWnd, nCmdShow);

   UpdateWindow(hWnd); 

   return TRUE;

} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

      int wmId, wmEvent;

      PAINTSTRUCT ps;

      HDC hdc;

      TCHAR str[11]; 

      switch (message)

      {

      case WM_COMMAND:

            wmId    = LOWORD(wParam);

            wmEvent = HIWORD(wParam);

            // Parse the menu selections:

            switch (wmId)

            {

            case ID_START:

                  if(!started)

                  {

                        GetWindowText(hEdCount, str, 10);

                        count = _wtoi(str);

                        if(count <= 2)

                        {

                              MessageBox(hWnd, L"Введено неверное значение!", L"Ошибка", 0);

                        }

                        else

                        {

                              SendMessage(hTable, LVM_DELETEALLITEMS, 0, 0);

Информация о работе Написание программы