69993

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

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

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

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

Русский

2014-10-13

68.5 KB

11 чел.

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

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

Кафедра ЭВМ

Лабораторная работа №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-приложений, организацией взаимодействия программ с ОС, получил практические навыки по составлению, написанию и отладке простых программ. Ознакомился с ресурсами как средством создания визуального интерфейса и задания параметров и характеристик программного приложения.


 

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

80062. Рідне слово 66.5 KB
  Капітан. Наш девіз: «Чим важче завдання, Тим дорожче перемога.» Ми зібрались в класі дружно, Щоб позмагатись І про мову нашу рідну Цікаве дізнатись. Дорогенькі суперники, Щиро вас вітаємо Від усього серця свого Успіху бажаємо. Щоб трудились ви сьогодні До сьомого поту І дістали нагороду...
80063. Презентація проекту «Стежками рідного краю» 77.5 KB
  Мета: активізувати і поширити набуті під час екскурсій знання учнів про рідний край; розвивати інтелект та творчу уяву; формувати громадянські, комунікативні, історико-культурні та соціокультурні компетентності. Обладнання: мультимедійний екран, комп’ютер, мольберти, ватмани.
80064. Ритмічна вправа. Музичні ігри 121.5 KB
  Розвивати координацію рухів; відчуття ритму і такту; увагу, пам’ять; гнучкість і пластичність. Виховувати естетичні почуття, прищеплювати любов до всього красивого, витонченого. Обладнання: магнітофон, касетний запис з дитячими піснями, м’ячі.
80065. Погано одному (урок–спілкування). Вступ: Поняття про риторику як науку 98 KB
  Ознайомити учнів з поняттям «спілкування»; пояснити, що мовлення є найважнішим засобом спілкування, обміну думками і почуттями між людьми. Дати уявлення про риторику, як науку. Розвивати мовлення учнів, формувати вміння висловлювати власну думку.
80066. Перевір себе. Чого ми навчились? Чого навчає наука риторика? 86.5 KB
  Привітання гостей Учитель: Діти сьогодні до нас на урок завітали гості. Поверніться будь ласка обличчям до гостей щоб привітатися віршове привітання Учитель: Треба всім нам привітатись Учні: Добрий день Учитель: Дружно весело сказати Учні: Добрий день Учитель: Вліво вправо повернулись...
80067. Демосфенові поради 38 KB
  Мета. Познайомити дітей з новим навчальним предметом - риторикою, з історією виникнення риторики, порадами Демосфена, розвивати усне мовлення учнів, виховувати почуття ввічливості. Обладнання: малюнок із зображенням Риторинки на Демосфена, лялька - Риторинка, посібник «Риторика», зошит.
80068. Різдвяні зустрічі 94 KB
  Мета: на кращих зразках творів світової літератури, музики та народної творчості вчити учнів читати мовою оригіналу; розвивати навики виразного читання, акторські здібності, вміння працювати в команді; виховувати любов до мистецтва, гарний смак.
80069. Від Різдва до Водохреща 69.5 KB
  Мета: знайомити учнів з традиціями, звичаями та обрядами українського народу, що пов’язані Різдвяно-новорічними святами; розвивати акторські здібності учнів, уміння виразно читати поетичні та прозові твори; виховувати повагу до традицій нашого народу, милосердя, почуття прекрасного.
80070. ROAD SAFETY 49 KB
  It is a traffic-light. You can see it at the cross-roads in the big cities. Look. It has three colours: red, yellow and green. If you see a red colour you must stop. If you see a yellow colour you must wait. If you see a green colour you can cross the street.