69993

МНОГОЗАДАЧНОСТЬ И МНОГОПОТОЧНОСТЬ

Лабораторная работа

Информатика, кибернетика и программирование

Цель: Ознакомление с концепцией многозадачности и многопоточности современных операционных систем, получение практических навыков по составлению, написанию и отладке программ, содержащих параллельно функционирующие процедуры и функции.

Русский

2014-10-13

68.5 KB

14 чел.

Министерство образования и науки Украины

Харьковский Национальный Университет Радиоэлектроники

Кафедра ЭВМ

Лабораторная работа №5

Тема: «МНОГОЗАДАЧНОСТЬ И МНОГОПОТОЧНОСТЬ»

Выполнил:                                                                      Проверил:

ст. гр. КИ-08-4                                                                Бугрий А. Н.

Кравец Артём Валерьевич

2009

Лабораторная работа №5

Тема: «МНОГОЗАДАЧНОСТЬ И МНОГОПОТОЧНОСТЬ»

Цель: Ознакомление с концепцией многозадачности и многопоточности современных операционных систем, получение практических навыков по составлению, написанию и отладке программ, содержащих параллельно функционирующие процедуры и функции. 

Задание:

Вариант 6

Создать многопоточную программу, формирующую потоки трех типов. Каждый из потоков запускается соответствующим пунктом меню и захватывает соответственно 1,2,3 ресурса (максимальное число ресурсов по умолчанию – 8 и может меняться пользователем в окне диалога, вызываемом через меню). Количество, вид потоков, а также их состояние выводится на экран. Если число ресурсов не позволяет работать потоку, он находится в состоянии ожидания. Удаление потоков осуществляется через меню в порядке запуска (первым удаляется поток, запущенный первым).

Листинг:

include "stdafx.h"

#include "Laba_5.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:

HINSTANCE hInst;        

TCHAR szTitle[MAX_LOADSTRING];     

TCHAR szWindowClass[MAX_LOADSTRING];

int i=0, j=0, k=0;

LONG x;

char str[23] = "Свободных ресурсов - 8";

char str1[] = "Запущено потоков 1го типа - 0";

char str2[] = "Запущено потоков 2го типа - 0";

char str3[] = "Запущено потоков 3го типа - 0";

HWND hWnd;

HANDLE hSmphr;

// Отправить объявления функций, включенных в этот модуль кода:

ATOM    MyRegisterClass(HINSTANCE hInstance);

BOOL    InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPTSTR    lpCmdLine,

                    int       nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

MSG msg;

HACCEL hAccelTable;

 // Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_LABA_5, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

 // Выполнить инициализацию приложения:

 if (!InitInstance (hInstance, nCmdShow))

{

 return FALSE;

}

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

 // Цикл основного сообщения:

 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_LABA_5));

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

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

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_LABA_5);

wcex.lpszClassName = szWindowClass;

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

 return RegisterClassEx(&wcex);

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

  hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

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

  if (!hWnd)

  {

     return FALSE;

  }

  ShowWindow(hWnd, nCmdShow);

  UpdateWindow(hWnd);

  return TRUE;

}

DWORD WINAPI Thread1(PVOID pvoid)

{

OpenSemaphore(NULL, TRUE,"MySemaphore");

i++;

 if ( WaitForSingleObject( hSmphr, 0 ) == WAIT_OBJECT_0 )

   ReleaseSemaphore( hSmphr, 1, &x );

wsprintf(str,"Свободных ресурсов - %i",x+1);

wsprintf(str1,"Запущено потоков 1го типа - %i",i);

InvalidateRect(hWnd, NULL, FALSE);

 return 0;

}

DWORD WINAPI Thread2(PVOID pvoid)

{

OpenSemaphore(NULL, TRUE,"MySemaphore");

j++;

 if ( WaitForSingleObject( hSmphr, 0 ) == WAIT_OBJECT_0 )

   ReleaseSemaphore( hSmphr, 1, &x );

wsprintf(str,"Свободных ресурсов - %i",x+1);

wsprintf(str2,"Запущено потоков 2го типа - %i",j);

InvalidateRect(hWnd, NULL, FALSE);

 return 0;

}

DWORD WINAPI Thread3(PVOID pvoid)

{

OpenSemaphore(NULL, TRUE,"MySemaphore");

k++;

 if ( WaitForSingleObject( hSmphr, 0 ) == WAIT_OBJECT_0 )

   ReleaseSemaphore( hSmphr, 1, &x );

wsprintf(str,"Свободных ресурсов - %i",x+1);

wsprintf(str3,"Запущено потоков 3го типа - %i",k);

InvalidateRect(hWnd, NULL, FALSE);

 return 0;

}

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

{

 int wmId, wmEvent;

 static PAINTSTRUCT ps;

 static HDC hdc;

 static DWORD IDThread1, IDThread2, IDThread3;

 static HANDLE hT1, hT2, hT3;

 switch (message)

{

 case WM_CREATE:

 hSmphr = CreateSemaphore(NULL, 8, 8, "MySemaphore");

 break;

 case WM_COMMAND:

 wmId    = LOWORD(wParam);

 wmEvent = HIWORD(wParam);

 switch (wmId)

 {

  case IDM_STARTTHREAD1:

     hT1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,0,0,&IDThread1);

     WaitForSingleObject(hSmphr, INFINITE);

    break;

  case IDM_STARTTHREAD2:

     hT2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread2,0,0,&IDThread2);

     WaitForSingleObject(hSmphr, INFINITE);

     WaitForSingleObject(hSmphr, INFINITE);

    break;

  case IDM_STARTTHREAD3:

     hT3 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread3,0,0,&IDThread3);

     WaitForSingleObject(hSmphr, INFINITE);

     WaitForSingleObject(hSmphr, INFINITE);

     WaitForSingleObject(hSmphr, INFINITE);

    break;

  case IDM_FINISHTHREAD1:

   ReleaseSemaphore(hSmphr,1,&x);

   TerminateThread(hT1, 0);

    i--;

   wsprintf(str,"Свободных ресурсов - %i",x+1);

   wsprintf(str1,"Запущено потоков 1го типа - %i",i);

   InvalidateRect(hWnd, NULL, FALSE);

    break;

  case IDM_FINISHTHREAD2:

   ReleaseSemaphore(hSmphr,2,&x);

   TerminateThread(hT2, 0);

    j--;

   wsprintf(str,"Свободных ресурсов - %i",x+2);

   wsprintf(str2,"Запущено потоков 2го типа - %i",j);

   InvalidateRect(hWnd, NULL, FALSE);

    break;

  case IDM_FINISHTHREAD3:

   ReleaseSemaphore(hSmphr,3,&x);

   TerminateThread(hT3, 0);

    k--;

   wsprintf(str,"Свободных ресурсов - %i",x+3);

   wsprintf(str3,"Запущено потоков 3го типа - %i",k);

   InvalidateRect(hWnd, NULL, 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);

  RECT rt;

  GetClientRect(hWnd, &rt);

  TextOut(hdc, 350, 50, str, strlen(str));

  TextOut(hdc, 75, 50, str1, strlen(str1));

  TextOut(hdc, 75, 75, str2, strlen(str2));

  TextOut(hdc, 75, 100, str3, strlen(str3));

  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;

}

Результат:

Выводы: В этой лабораторной работе я ознакомился со структурой Windows-приложений, организацией взаимодействия программ с ОС, получил практические навыки по составлению, написанию и отладке простых программ. Ознакомился с ресурсами как средством создания визуального интерфейса и задания параметров и характеристик программного приложения.


 

А также другие работы, которые могут Вас заинтересовать

83199. СТРАТЕГІЧНІ АСПЕКТИ ФІНАНСОВО-ЕКОНОМІЧНОЇ БЕЗПЕКИ ПІДПРИЄМСТВА 53.5 KB
  У сучасних умовах процес успішного функціонування і економічного розвитку вітчизняних підприємств багато в чому залежить від міри забезпечення їх економічної безпеки. Економічна безпека будьякого підприємства це захищеність його діяльності від негативних впливів зовнішнього середовища спроможність швидко усунути різноманітні погрози...
83200. Проблемы высвобождения и конверсии РЧС в Российской Федерации 185 KB
  Государственные решения по регулированию использования частот должны быть направлены на гармонизацию использования радиочастотного спектра в соответствии с международными договорами Российской Федерации (РФ) путем высвобождения и конверсии РЧС. В результате этих решений Постановлением Правительства РФ должна быть определена доля РЧС...
83201. КОМПОЗИЦИОННЫЕ МАТЕРИАЛЫ НА ОСНОВЕ МАГНЕЗИАЛЬНОГО ВЯЖУЩЕГО И СИНТЕТИЧЕСКОГО ВОЛЛАСТОНИТА 56.91 KB
  В статье показана возможность получения композиционных материалов на основе магнезиального вяжущего и синтетического волластонита, полученного на основе электротермофосфорного шлака, с повышенным пределом прочности при сжатии.
83202. Положительные и отрицательные черты главного героя в повести «Над пропастью во ржи» 34.56 KB
  Но для меня Холден является скорее предметом подражания нежели негодования. Углубляясь в детали в своем рассказе Холден дает понять как дороги они для него насколько настоящие они и как действительно приятно было бы встречать в жизни только таких людей. Сильнее всего в людях Холдену не нравится их желание быть тем кем они на самом деле не являются.
83204. Моя семья в Великой Отечественной войне 18.02 KB
  Я хочу рассказать о своих прадедушках и прабабушке. Мой прадедушка Белоусов Леонид Яковлевич был кадровым военным. Участвовал прадедушка и во взятии Рейхстага на стене которого потом расписался. Прадедушка вернулся с войны и еще много лет работал в колхозе Архангельского района.
83205. Томск сокровенный 12.82 KB
  За все мои прожитые годы у меня сложилось мнение в какой-то степени сокровенные чувства которые я бы не смогла рассказать на публике но именно сейчас я хочу поделиться о своей влюбленности к любимому Томску. Конечно как и в любом другом городе в Томске стоит множество памятников.
83206. Изготовление светильника, творческий проект 1.82 MB
  Столярный верстак шаблон карандаш ножовка. Изготовить шип Столярный верстак угольник линейка карандаш ножовка долото киянка. Изготовить проушину Столярный верстак угольник линейка карандаш ножовка долото киянка. Столярный верстак киянка кисть клей ПВА.
83207. Анализ научного текста 38.83 KB
  Как правило, для фиксирования точки конца титрования в комплексонометрии используют так называемые металл-индикаторы, которые представляют собой органические красители, образующие с катионами определяемых металлов растворимые в воде окрашенные комплексные соединения.