- •З лабораторних робіт з предмету:
- •Лабораторна робота № 1
- •Контрольні запитання
- •Лабораторна робота № 2 Дослідження особливостей організації ресурсів інтерфейсу користувача для Windows-додатків
- •Лабораторна робота № 3. Вікна діалогу у Windows-додатках
- •Контрольні запитання та завдання
- •Лабораторна робота № 4. Дослідження особливостей використання арі-функцій для роботи із процесами та потоками у Windows
- •Контрольні запитання та завдання
- •Пріоритети
- •Лабораторна робота № 5 Дослідження особливостей планування потоків у операційній системі Windows Контрольні запитання та завдання
- •Динамічне підвищення пріоритету
Лабораторна робота № 4. Дослідження особливостей використання арі-функцій для роботи із процесами та потоками у Windows
Програма:
#define WIN32_LEAN_AND_MEAN
using namespace std;
#include "stdafx.h"
#include "windows.h"
#include "resource.h"
#include <string>
const unsigned short int max=10;
STARTUPINFO St_Info;
unsigned short int i, ProcNum=0;
PROCESS_INFORMATION Proc_Info[max];
std::string help_str1, help_str2;
char* buf;
HMENU Sub_Menu;
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
int APIENTRY WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS w;
memset(&w,0,sizeof(WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = (HBRUSH)COLOR_WINDOW;
w.lpszClassName = "C Windows";
w.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
RegisterClass(&w);
hwnd = CreateWindow("C Windows","C Windows", WS_OVERLAPPEDWINDOW,
10,10,600,480,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,nCmdShow);
//HMENU hMenu=LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));
//SetMenu(hwnd, hMenu);
UpdateWindow(hwnd);
hInst= hInstance;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
if (Message == WM_DESTROY)
{
PostQuitMessage(0);
return 0;
}
if (Message == WM_RBUTTONUP)
{
MessageBox(hwnd, "WM_RBUTTONUP", "Message", MB_ICONINFORMATION | MB_OK);
}
// створення в³кна
if (Message == WM_CREATE)
{
Sub_Menu=GetSubMenu(GetMenu(hwnd),0);
}
if (Message == WM_PAINT)
{
}
//обробка под³й меню
if (Message == WM_COMMAND)
{
switch ( LOWORD(wparam) )
{
case IDM_New_Process:
{
if (ProcNum<max)
{
St_Info.cb=sizeof(St_Info);
St_Info.lpReserved=NULL;
St_Info.lpDesktop=NULL;
St_Info.lpTitle=NULL;
St_Info.dwFlags=STARTF_USESHOWWINDOW;
St_Info.wShowWindow=SW_SHOWNORMAL;
St_Info.cbReserved2=0;
St_Info.lpReserved2=NULL;
if (CreateProcess(NULL,"Notepad.exe",
NULL,NULL,false,0,NULL,NULL,&St_Info,&Proc_Info[ProcNum]))
{
ProcNum++;
help_str1="";
buf=(char*)malloc(sizeof(DWORD));
itoa((DWORD)Proc_Info[ProcNum-1].hProcess, buf, 10);
help_str2=buf;
help_str1=help_str1+"Дескриптор процесу: " + help_str2.data();
itoa((DWORD)Proc_Info[ProcNum-1].hThread, buf, 10);
help_str2=buf;
help_str1=help_str1 + ", Дескриптор потоку: " + help_str2.data();
itoa((DWORD)Proc_Info[ProcNum-1].dwProcessId, buf, 10);
help_str2=buf;
help_str1=help_str1 + ", ²дентиф³катор процесу: " + help_str2.data();
itoa((DWORD)Proc_Info[ProcNum-1].dwThreadId, buf, 10);
help_str2=buf;
help_str1=help_str1 + ", ²дентиф³катор потоку: " + help_str2.data();
MessageBox(hwnd, help_str1.data(),"Новий процес створено!", MB_OK);
EnableMenuItem(Sub_Menu,IDM_Kill_Process,MF_BYCOMMAND + MF_ENABLED);
}
else
MessageBox(hwnd,"Неможливо створити процес","Створення процесу", MB_OK);
}else MessageBox(hwnd,"Дуже багато створено процес³в",
"Створення процесу", MB_OK);
break;
}
case IDM_Kill_Process:
{
if (ProcNum>0)
{
DWORD ExitCode;
GetExitCodeProcess(Proc_Info[ProcNum-1].hProcess, &ExitCode);
if (ExitCode==STILL_ACTIVE)
TerminateProcess(Proc_Info[ProcNum-1].hProcess,0);
else MessageBox(hwnd,"Неможливо завершити процес",
"Завершення процесу", MB_OK);
ProcNum--;
}
if (ProcNum==0)
{
EnableMenuItem(Sub_Menu,IDM_Kill_Process,
MF_BYCOMMAND + MF_GRAYED); //якщо немаº запущ. процес³в - зробити недоступним пункт меню.
MessageBox(hwnd,"Немаº б³льше процес³в",
"Завершення процесу", MB_OK);
}
break;
}
case IDM_Exit:
{
SendMessage(hwnd,WM_CLOSE,0,0);
break;
}
case ID_INFO:
{
MessageBox(hwnd, "Лабораторна робота з ОС", "Info", MB_ICONINFORMATION);
break;
}
}
}
return DefWindowProc(hwnd,Message,wparam,lparam);
}
#include <iostream>
#include <windows.h>
using namespace std;
DWORD ThreadId;
DWORD ThreadParameter=10;
HANDLE hThread;
DWORD WINAPI MyThread(LPVOID lpParam)
{
TCHAR msgBuf[100]="Hello from thread!";
MessageBox(NULL, msgBuf, "mess..", MB_ICONINFORMATION);
return 0;
}
int main()
{
cout<<"Creating thread...\n";
hThread=CreateThread(
NULL, // атрибути безпеки за замовчуванням
0, // розмір стека за замовчуванням
(LPTHREAD_START_ROUTINE)MyThread , // вказівник на процедуру створюваного потоку
&ThreadParameter, // аргумент, що передається функції потоку
0, // прапорці створення за замовчуванням
&ThreadId); // отриманий ідентифікатор потоку
if (!hThread)
cout<<"CreateThread failed.";
WaitForSingleObject(hThread, 2000);
CloseHandle(hThread);
return 0;
}
