Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
05.06.2015
Размер:
43.52 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Кіровоградський національний технічний університет

МТФ

Кафедра Програмного забезпечення

Дисципліна Обчислювальні системи

Лабораторна робота №1

на тему: «Організація багатозадачності на засадах багатопроцесності

Виконав ст. гр. КІ-09-2

Кірнус Л.Є.

Перевірив викладач

Доренський О.П.

Кіровоград 2012

#include <windows.h>

#include <string.h>

#include <stdio.h>

#include "proc.h"

#define PROCMAX 1000

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

char szWinName[] = "Моє вікно"; /* Ім'я класу вікна */

char str[255]; /* буфер рядка виведення */

int maxX, maxY; /* розміри екрану */

int X = 0, Y = 0; /* поточні координати виведення */

int procnum = 0; /* кількість активних процесів */

HDC memdc;

HBITMAP hbit;

HBRUSH hbrush;

PROCESS_INFORMATION pinfo[PROCMAX];

int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst,

LPSTR lpszArgs, int nWinMode)

{

HWND hwnd;

MSG msg;

WINDCLASS wcl;

HANDLE hAccel;

/* визначити клас вікна */

wcl.hInstance = hThisInst; /* дескриптор даного додатка */

wcl.lpazClassName = szWinName ; /* ім'я класу вікна */

wcl.lpfnWndProc = WindowFunc; /* функція вікна */

wcl.style = 0; /* стиль за замовченням */

wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* стандартна іконка */

wcl.hCursor = LoadCursor(NULL, IDC_ARROW); /* стандартний курсор */

wcl.lpszMenuName = "MYMENU"; /* меню */

wcl.cbClsExtra = 0; /* без додаткової */

wcl.cbWndExtra = 0; /* інформації */

/* визначити заповнення вікна білим коляром */

wcl.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);

/* зареїструвати клас вікна */

if (!RegisterClass(&wcl))

return 0;

/* створити вікно */

hwnd = CreateWindow(szWinName, /* ім'я класу */

"Процеси", /* заголовок */

WS_OVERLAPPEDWINDOW,/* стиль вікна */

CW_USEDEFAULT, /* X - координата, яка визначається Windows */

CW_USEDEFAULT, /* Y - координата, яка визначається Windows */

CW_USEDEFAULT, /* Ширина, яка визначається Windows */

CW_USEDEFAULT, /* Висота, яка визначається Windows */

HWND_DESKTOP, /* відсутнє батьківське вікно */

NULL, /* відсутнє меню */

hThisInst, /* дескриптор додатку */

NULL); /* без додаткових аргументів */

/* завантажити акселератори */

hAccesl = LoadAccelerators(hThisInst, "MYMENU");

/* показати вікно та перерисовати вміст */

ShowWindow(hwnd, nWinMode);

UpdateWindow(hwnd);

/* запустити цикл обробки повідомлень */

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

{

if (!TranslateAccelerator(hwnd, hAccel, &msg))

{

TranslateMessage(&msg); /* дозволити використання клавіатури */

DispatchMessage(&msg); /* повернути керування Windows */

}

}

return msg.wParam;

}

/* Наступна функція викликається ОС Windows і отримує як параметри */

/* повідомлення з черги даного додатка */

LRESULT CALLBACK WindowFunc (HWND hwnd, UNIT message,

WPARAM wParam,

LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT paintstruct;

TEXTMETRIC tm;

STARTUPINFO startin;

Switch(message)

{

case WM_CREATE:

/* Отримуємо розміри екрану */

maxX = GetSystemMetrics(SM_CXSCREEN);

maxY = GetSystemMetrics(SM_CYSCREEN);

/* будуємо растр, який сумісний з вікном */

hdc = GerDC(hwnd);

memdc = CreateCompatibleDC(hdc);

hbit = CreateCompatibleBitmap(hdc, maxX, maxY);

SelectObject(memdc, hbit);

Hbrush = GetStockObject(WHITE_BRUSH);

SelectObject(memdc, hbrush);

PatBlt(memdc, 0, 0, maxX, maxY, PATCOPY);

ReleaseDC(hwnd, hdc);

break;

case WM_COMMAND:

switch(LOWRD(wParam))

{

case ID_PROCESS:

if (procnum == PROCMAX)

{

MessageBox(hwnd, "Не можна створити більше", "Помилка", MB_OK);

break; /* Не більше ніж PROCMAX */

}

/* Отримати метрики тексту */

GetTextMetrics(memdc, &tm);

sprintf(str, "Породжує процес %d", procnum);

TextOut(memdc, X, Y, str, strlen(str);

Y = Y + tm.tmHeight + tm.ExternalLeading;

InvalidateRect(hwnd, NULL, 1);

/* Породження нового процесу */

startin.cb = sizeof(STARTUPINFO);

startin.lpReserved = NULL;

startin.lpDesctop = NULL;

startin.lpTitle = NULL;

startin.dwFlags = STARTF_USESHOWWINDOW;

startin.cbReserved2 = 0;

startin. lpReserved2 = NULL;

startin.wShowWindow = SW_SHOWMINIMIZED;

CreateProcess(NULL, "process.exe", NULL, NULL, FALSE, 0, NULL, NULL, &startin, &(pinfo[procnum]));

procnum + + ;

break;

case ID_KILPROC:

if (procnum)

procnum - -;

else

{

MessageBox(hwnd, "Більше процесів немає", "Помилка", MB_OK);

break;

}

/* Отримати метрики тексту */

GetTextMetrics(memdc, &tm);

TerminateProcess(pinfo[procnum].hProcess, 0);

Sprintf(str, "Процес %d завершено", procnum);

TextOut(memdc, X, Y, str, strlen(str));

Y = Y + tm.tmHeight + tm.tmExternalLeading;

InvalidateRect(hwnd, NULL, 1);

break;

case ID_HELP:

MessageBox(hwnd,

"F2: Новий процес\n",

"F3: Завершити процес",

" Допомога", MB_OK);

break;

}

break;

case WM_PAINT: /* перерисовка вікна */

hdc = BeginPaint(hwnd, &paintstruct); /* отримати DC */

/* тепер копіюємо растр з пам'яті на екран */

BitBlt(hdc, 0, 0, maxX, maxY, memdc, 0, 0, SRCCOPY);

EndPaint(hwnd, &paintstruct); /* звільнити DC */

break;

case WM_DESTROY: /* завершення програми */

DeleteDC(memdc);

PostQuitMessage(0);

break;

default:

/* Всі повідомлення, які не обробляються у даній функції,*/

/* направляються на обробку за замоченням */

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

}

return 0;}

Соседние файлы в папке Вычислительные системы