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

Лабораторна робота 1 Тема: Процеси і потоки

Завдання:

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

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

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

Створення процесу в win32 api

#include <windows.h>

#include <iostream.h>

int main()

{

STARTUPINFO si;

PROCESS_INFORMATION pi;

// заполняем значения структуры STARTUPINFO по умолчанию

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

// запускаем процесс Notepad

if (!CreateProcess(

NULL, // имя не задаем

"Notepad.exe", // имя программы

NULL, // атрибуты защиты процесса устанавливаем по умолчанию

NULL, // атрибуты защиты первичного потока по умолчанию

FALSE, // дескрипторы текущего процесса не наследуются

0, // по умолчанию NORMAL_PRIORITY_CLASS

NULL, // используем среду окружения вызывающего процесса

NULL, // текущий диск и каталог, как и в вызывающем процессе

&si, // вид главного окна - по умолчанию

&pi // информация о новом процессе

)

)

{

cout << "The mew process is not created." << endl

<< "Check a name of the process." << endl;

return 0;

}

Sleep(1000); // немного подождем и закончим свою работу

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

CloseHandle(pi.hThread);

CloseHandle(pi.hProcess);

return 0;

}

Створення потоку в win32 api

#include <windows.h>

#include <iostream.h>

volatile int n;

DWORD WINAPI Add(LPVOID iNum)

{

cout << "Thread is started." << endl;

n += (int)iNum;

cout << "Thread is finished." << endl;

return 0;

}

int main()

{

int inc = 10;

HANDLE hThread;

DWORD IDThread;

cout << "n = " << n << endl;

// запускаем поток Add

hThread = CreateThread(NULL, 0, Add, (void*)inc, 0, &IDThread);

if (hThread == NULL)

return GetLastError();

// ждем, пока поток Add закончит работу

WaitForSingleObject(hThread, INFINITE);

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

CloseHandle(hThread);

cout << "n = " << n << endl;

return 0;

}

Лабораторна робота 2 Тема: Планування і взаємодія процесів і потоків

Завдання:

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

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

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

Приклад синхронізації потоків за допомогою об’єкта critical_section

#include <windows.h>

#include <iostream.h>

CRITICAL_SECTION cs;

DWORD WINAPI thread(LPVOID)

{

int i,j;

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

{

// входим в критическую секцию

EnterCriticalSection (&cs);

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

{

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

Sleep(7);

}

cout << endl;

// выходим из критической секции

LeaveCriticalSection(&cs);

}

return 0;

}

int main()

{

int i,j;

HANDLE hThread;

DWORD IDThread;

// инициализируем критическую секцию

InitializeCriticalSection(&cs);

hThread=CreateThread(NULL, 0, thread, NULL, 0, &IDThread);

if (hThread == NULL)

return GetLastError();

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

{

// входим в критическую секцию

EnterCriticalSection(&cs);

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

{

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

Sleep(7);

}

cout << endl;

// выходим из критической секции

LeaveCriticalSection(&cs);

}

// ждем, пока поток thread закончит свою работу

WaitForSingleObject(hThread, INFINITE);

// закрываем критическую секцию

DeleteCriticalSection(&cs);

return 0;

}