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


 

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

36583. Оператор присваивания 28.5 KB
  Левая часть это переменная любого типа правая часть выражение совместимое по типу с переменной левой части. При выполнении этого оператора вычисляется значение выражения правой части и это значение становится значением переменной левой части. Совместимость левой и правой частей присваивания по типу означает либо равенство типов либо случаи когда тип выражения правой части автоматически преобразуется к типу левой части. Эти случаи автоматического преобразования типов для известных нам стандартных типов исчерпываются следующими:  Тип...
36584. Стандартные типы данных, операции, выражения 48.5 KB
  Целые числа типа integer это числа диапазона 32768 . Константы типа integer обычные целые числа возможно со знаком. Синтаксическое определение целых чисел имеет вид: целое число ::= [ ] { цифра } В отличие от целых чисел вещественные числа типа rel представляются в памяти компьютера приближенно. Константы типа rel числа возможно с дробной частью отделяемой от целой части точкой.
36585. Структура программ на Паскале 36 KB
  Любая программа на Турбо Паскале имеет одну и ту же общую структуру: [ progrm имя программы ; ] [ раздел описаний ] begin раздел операторов end. Эта структура состоит из заголовка программы необязательного раздела описаний который может в особых случаях отсутствовать и раздела операторов содержащего хотя бы один оператор. Имя программы идентификатор выбираемый программистом. В разделе описаний должны быть описаны все нестандартные имена используемые далее в разделе операторов этой программы.
36586. Автоматизация турфирм 31 KB
  Комплексная автоматизация турфирмы позволяет: Автоматизировать оперативный и бухгалтерский учет в турфирмах Автоматизировать оперативную работу с клиентами Формировать турпакет из услуг поставщиков рассчитывать прайслисты и подготавливать электронный и бумажный каталоги цен. Автоматизация туристической деятельности естественным образом приводит к оптимизации бизнеспроцессов. Автоматизация рабочего места в тур. Автоматизация рабочих мест пользователей позволяет: формировать турпакет из услуг поставщиков рассчитывать прайслисты...
36587. Система бронирования Amadeus 37 KB
  В настоящее время mdeus ведущая компьютерная система бронирования в Европе. системы бронирования System One она активно продвигается и на американский рынок. Партнером mdeus является немецкая система бронирования туруслуг Strt и любой пользователь mdeus автоматически является также пользователем Strt.
36588. Реляционная модель данных 46.5 KB
  Любую таблицу упрощенно можно описать следующим образом: НАЗВАНИЕ ТАБЛИЦЫ Поле1 Поле2 Поле3ПолеN Например: СТУДЕНТЫНомер_зачетки ФИО Факультет. Располагаются столбцы в таблице в порядке следования их имен принятом при создании таблицы. В каждой таблице должен быть столбец или совокупность столбцов значение которого однозначно идентифицирует каждую запись таблицы. Этот столбец или совокупность столбцов называется первичным ключом primry key PK таблицы.
36589. Основы проектирования баз данных 93.5 KB
  Основные этапы проектирования баз данных 1 Концептуальное инфологическое проектирование Концептуальное инфологическое проектирование построение семантической смысловой модели предметной области то есть информационной модели наиболее высокого уровня абстракции. Такая модель создаётся без ориентации на какуюлибо конкретную СУБД и модель данных. Кроме того в этом контексте равноправно могут использоваться слова модель базы данных и модель предметной области поскольку такая модель является как образом реальности так и образом...
36590. Язык SQL 499.5 KB
  На раннем этапе развития систем управления базами данных(СУБД) в условиях низких технических характеристик ЭВМ основное внимание разработчиков СУБД было направлено на проблемы размещения информации в базе и обмена данными между дисковой памятью и оперативной памятью, поскольку это в первую очередь определяло эффективность функционирования СУБД
36591. Теорія механізмів і машин 8.12 MB
  Структура та класифікація механізмів Структура механізму це його будова. Будовою механізму визначаються такі його важливі характеристики як види виконуваних рухів способи їх перетворення число ступенів вільності. Основними структурними елементами механізму є ланки тверді тіла та кінематичні пари рухомі з’єднання твердих тіл. Ланки механізму рухомо з’єднані між собою.