Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи з ОС (win32API).doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
194.56 Кб
Скачать

Лабораторна робота 3 Тема: Практична реалізація багатопотоковості

Завдання:

1.Дослідити роботу програми.

2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.

3.За завданням викладача розробити власний проект на основі існуючого. Синхронізація потоків, які виконуються в різних процесах за допомогою м’ютекса

CreateMutex.cpp

#include <windows.h>

#include <iostream.h>

int main()

{

HANDLE hMutex;

char lpszAppName[] = "C:\\ConsoleProcess.exe";

STARTUPINFO si;

PROCESS_INFORMATION pi;

// создаем мьютекс

hMutex = CreateMutex(NULL, FALSE, "DemoMutex");

if (hMutex == NULL)

{

cout << "Create mutex failed." << endl;

cout << "Press any key to exit." << endl;

cin.get();

return GetLastError();

}

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

// создаем новый консольный процесс

if (!CreateProcess(lpszAppName, NULL, NULL, NULL, FALSE,

NULL, NULL, NULL, &si, &pi))

{

cout << "The new process is not created." << endl;

cout << "Press any key to exit." << endl;

cin.get();

return GetLastError();

}

// выводим на экран строки

for (int j = 0; j < 10; ++j)

{

// захватываем мьютекс

WaitForSingleObject(hMutex, INFINITE);

for (int i = 0; i < 10; i++)

{

cout << j << ' ' << flush;

Sleep(10);

}

cout << endl;

// освобождаем мьютекс

ReleaseMutex(hMutex);

}

// закрываем дескриптор мьютекса

CloseHandle(hMutex);

// ждем пока дочерний процесс закончит работу

WaitForSingleObject(pi.hProcess, INFINITE);

// закрываем дескрипторы дочернего процесса в текущем процессе

CloseHandle(pi.hThread);

CloseHandle(pi.hProcess);

return 0;

}

ConsoleProcess.cpp

#include <windows.h>

#include <iostream.h>

int main()

{

HANDLE hMutex;

int i,j;

// открываем мьютекс

hMutex = OpenMutex(SYNCHRONIZE, FALSE, "DemoMutex");

if (hMutex == NULL)

{

cout << "Open mutex failed." << endl;

cout << "Press any key to exit." << endl;

cin.get();

return GetLastError();

}

for (j = 10; j < 20; j++)

{

// захватываем мьютекс

WaitForSingleObject(hMutex, INFINITE);

for (i = 0; i < 10; i++)

{

cout << j << ' ' << flush;

Sleep(5);

}

cout << endl;

// освобождаем мьютекс

ReleaseMutex(hMutex);

}

// закрываем дескриптор объекта

CloseHandle(hMutex);

return 0;

}

Лабораторна робота 4 Тема: Керування оперативною пам’яттю

Завдання:

1.Дослідити роботу програми.

2.Описати документацію на типи даних, структури та функції win32 api, які використовуються в програмі.

3.За завданням викладача розробити власний проект на основі існуючого. Ініціалізація і копіювання блоків віртуальної пам’яті

#include <windows.h>

#include <iostream.h>

int main()

{

BYTE *a, *b; // указатели на блоки памяти

const int size = 1000; // размерность массива

// распределяем виртуальную память

a = (BYTE*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);

if(!a)

{

cout << "Virtual allocation failed." << endl;

return GetLastError();

}

b = (BYTE*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);

if(!b)

{

cout << "Virtual allocation failed." << endl;

return GetLastError();

}

// инициализируем символом X

FillMemory(a, size, 'X');

// копируем блок A в блок B

CopyMemory(b, a, size);

// распечатываем результат

cout << "b[10] = " << b[10] << endl;

// освобождаем виртуальную память

if (!VirtualFree(a, 0, MEM_RELEASE))

{

cout << "Memory release failed." << endl;

return GetLastError();

}

return 0;

}