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

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

Описание

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

Содержание

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

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

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

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

                              //vilki = new CRITICAL_SECTION[count];

                              vilki = (CRITICAL_SECTION*)malloc(count*sizeof(CRITICAL_SECTION));

                              for(int i=0; i<count; i++)

                              {

                                    InitializeCriticalSection(&vilki[i]);

                              }

                              h_ev = CreateEvent(0, true, false, EV_BARIER);

                              h_thr = new HANDLE[count];

                              indexes = new int[count];

                              for(int k=0; k<count; k++)

                              {

                                    indexes[k] = k;

                              } 

                              for(int i=0; i<count; i++)

                              {

                                    h_thr[i] = CreateThread(0, 0, ThreadProc, &(indexes[i]), 0, 0);

                              } 

                              SetWindowText(hButStart, L"Остановить");

                              started = true;

                              //GetClientRect(hWnd, &rect);

                              rect.top = 400;

                              rect.left = 500;

                              rect.bottom = 500;

                              rect.right = 700;

                              for (int i=0;i<5;i++)

                                    Y[i] = 0;

                              SetEvent(h_ev);

                        }

                  }

                  else

                  {

                        SetWindowText(hButStart, L"Запустить");

                        for(int i=0; i<count; i++)

                        {

                              TerminateThread(h_thr[i], 0);

                        }

                        delete [] h_thr;

                        delete [] indexes;

                        for(int i=0; i<count; i++)

                              DeleteCriticalSection(&vilki[i]);

                        //delete [] (CRITICAL_SECTION*)vilki;

                        free(vilki);

                        CloseHandle(h_ev);

                        started = false;

                  }

                  break;

            case IDM_ABOUT:

                  DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

                  break;

            case IDM_EXIT:

                  DestroyWindow(hWnd);

                  break;

            default:

                  return DefWindowProc(hWnd, message, wParam, lParam);

            }

            break;

      case WM_PAINT:

            hdc = BeginPaint(hWnd, &ps); 

            SelectObject(hdc, hFont);

            SetBkColor(hdc, RGB(255,255,255));

            TextOut(hdc, 10, 50, L"кол-во вилок:", wcslen(L"кол-во вилок:"));

            MoveToEx(hdc, 500, 400, 0);

            LineTo(hdc, 650, 400);

            for(int i=0; i<5; i++)

            {

                  Ellipse(hdc, 500 + i*30, 400 + Y[i], 510 + i*30, 410 + Y[i]);

            }

            EndPaint(hWnd, &ps);

            break;

      case WM_DESTROY:

            PostQuitMessage(0);

            break;

      default:

            return DefWindowProc(hWnd, message, wParam, lParam);

      }

      return 0;

} 

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

      UNREFERENCED_PARAMETER(lParam);

      switch (message)

      {

      case WM_INITDIALOG:

            return (INT_PTR)TRUE;

      case WM_COMMAND:

            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

            {

                  EndDialog(hDlg, LOWORD(wParam));

                  return (INT_PTR)TRUE;

            }

            break;

      }

      return (INT_PTR)FALSE;

}

 

Приложение  Б Пример протокола выполнения программы 
 

      Количество  философов: 3. 

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