готов лаби 4 курс 1 сим / Вычислительные системы / laba1
.docМіністерство освіти і науки, молоді та спорту України
Кіровоградський національний технічний університет
МТФ
Кафедра Програмного забезпечення
Дисципліна Обчислювальні системи
Лабораторна робота №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;}