Читайте также: |
|
Лабораторна робота № 3.
Тема: Управління потоками та процесами у Windows.
Мета: Ознайомитись з основними АРІ-функціями для управління потоками та процесами.
Теоретичні відомості.
Основні функції WinAPI, котрі використовуються для роботи з процесами та потоками:
1. CreateProcess – створення процесу.
2. TerminateProcess – завершення процесу.
3. CreateThread – створення потоку.
4. WaitForSingleObject – очікування завершення роботи потоку.
Cтворення процесу здійснюється за допомогою функції CreateProcess:
BOOL CreateProcess( LPCTSTR lpApplicationName, // ім'я виконуваного модуля LPTSTR lpCommandLine, // параметри командного рядка LPSECURITY_ATTRIBUTES lpProcessAttr, // захист процесу LPSECURITY_ATTRIBUTES lpThreadAttr, // захист основного потоку процесу BOOL bInheritHandles, // чи наслідуються властивості батьківського процесу DWORD dwCreationFlags, // параметри процесу LPVOID lpEnvironment, // параметри середовища LPCTSTR lpCurrentDirectory, // поточний диск або каталог LPSTARTUPINFO lpStartupInfo, // початкові параметри процесу LPPROCESS_INFORMATION lpProcessInformation // інформація про процес ); |
В результаті успішного виконання функція поверне TRUE. У разі невдачі - FALSE.
Параметри:
pApplicationName – шлях до програми, яку потрібно запустити.
lpCommandLine - тут передаються параметри командного рядка (за потребою, якщо запускається консольна програма). Якщо не використовується, то пишемо NULL.
lpProcessAttributes - атрибути захисту для програми. Якщо вказати NULL то система зробить це за замовчуванням.
lpThreadAttributes - атрибути захисту для першого потоку програми. Якщо вказати NULL то система зробить це за замовчуванням.
bInheritHandles – параметр, який вказує, чи успадковується дескриптор батьківського процесу. TRUE – успадковується, FALSE – ні.
dwCreationFlags – задає параметри створення процесу і пріоритет процесу. Основні значення:
CREATE_NEW_CONSOLE | новий процес відкривається у новому консольному вікні. |
HIGH_PRIORITY_CLASS | процес є критичним для системи |
IDLE_PRIORITY_CLASS | процес працює у фоновому режимі |
NORMAL_PRIORITY_CLASS | стандартний пріоритет |
REALTIME_PRIORITY_CLASS | найвищий пріоритет (пріоритет реального часу) |
lpEnvironment - вказує на параметри середовища. Якщо NULL, то буде використано параметри батьківського процесу.
lpCurrentDirectory - визначає поточний диск і каталог. Якщо NULL то буде використаний диск і каталог батьківського процесу.
lpStartupInfo - використовується для налаштування властивостей процесу, наприклад розташування вікон і заголовок.
Структура повинна бути правильно ініціалізована:
STARTUPINFO sti; // структура
ZeroMemory(&sti, sizeof(STARTUPINFO));//обнулити всі поля структури
sti.cb = sizeof (STARTUPINFO); // визначити розмір структури
lpProcessInformation - структура PROCESS_INFORMATION з інформацією про процес. Буде заповнена операційною системою Windows.
Один процес може завершити другий процес за допомогою виклику функції TerminateProcess, яка має наступний прототип:
BOOL TerminateProcess ( HANDLE hProcess, //дескриптор процесу UINT uExitCode // код завершення процесу ); |
Якщо функція TerminateProcess виконалася успішно, то вона повертає значення дорівнює TRUE. В іншому випадку повертається значення одно FALSE.
Функція TerminateProcess завершує роботу процесу, але не звільняє всі ресурси, що належать цьому процесу. Тому ця функція повинна викликатися тільки в аварійних ситуаціях при зависанні процесу.
Потік створюється функцією CreateThread, яка має наступний прототип:
HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибути захисту DWORD dwStackSize, // розмір стека потоку в байтах LPTHREAD_START_ROUTINE lpStartAddress, // адреса виконуваної функції LPVOID lpParameter, // адреса параметра DWORD dwCreationFlags, // прапори створення потоку LPDWORD lpThreadId // ідентифікатор потоку ); |
При успішному завершенні функція CreateThread повертає дескриптор створеного потоку і його ідентифікатор, який є унікальним для всієї системи. У випадку невдачі ця функція повертає значення NULL.
Призначення параметрів функції CreateThread:
lpThreadAttributes - встановлює атрибути захисту створюваного потоку. Встановлюємо значення цього параметра в NULL. Це означає, що атрибути захисту потоку збігаються з атрибутами захисту батьківського процесу.
dwStackSize - визначає розмір стека, який виділяється потоку при запуску. Якщо цей параметр дорівнює нулю, то потоку виділяється стек, розмір якого дорівнює за замовчуванням 1 Мб. Це найменший розмір стека, який може бути виділений потоку. Якщо величина параметра dwStackSize менше значення, заданого за замовчуванням, то все одно потоку виділяється стек розмірів в 1Мб. Операційна система Windows округлює розмір стека до однієї сторінки пам'яті, що звичайно дорівнює 4 Кб.
lpStartAddress – вказує на виконувану потоком функцію. Ця функція повинна мати наступний прототип:
DWORD WINAPI ThreadProc (LPVOID lpParameters);
Параметр lpParameter є єдиним параметром, який передається функції потоку.
dwCreationFlags - визначає, в якому стані буде створений потік. Якщо значення цього параметра дорівнює 0, то функція потоку починає виконуватися відразу після створення потоку. Якщо ж значення цього параметра встановлено CREATE_SUSPENDED, то потік створюється в підвішеному стані. Надалі цей потік можна запустити викликом функції ResumeThread.
lpThreadId - є вихідним параметром, тобто його значення встановлює Windows. Цей параметр повинен вказувати на змінну, в яку Windows помістить ідентифікатор потоку, який унікальний для всієї системи і може надалі використовуватися для посилань на потік.
Для очікування завершення роботи потоку використовується функція:
DWORD WaitForSingleObject( HANDLE hHandle, // дескриптор потоку DWORD dwMilliseconds // інтервал очікування в мілісекундах ); |
Ця функція очікує завершення потоку встановлену кількість мілісекунд, коли час закінчиться – основна програма буде виконуватись далі. Якщо другий параметр встановити рівним INFINITE, то чекаємо, поки потік не завершиться самостійно.
Наведемо приклад програми, яка використовує функцію CreateThread для створення потоку, і продемонструємо спосіб передачі параметрів до виконуваної потоком функції.
Постановка задачі:
Використовуючи АРІ-функції реалізувати наступні задачі для роботи з процесами та потоками:
1. Робота з процесами:
1) Запустити програму notepad з високим пріоритетом.
2) Завершити виконання програми через 10 секунд.
2. Робота з потоками:
1) Написати програму для одночасного опрацювання масиву двома потоками. Перший потік знаходитиме максимальний елемент масиву, другий - середнє арифметичне елементів масиву.
Дата добавления: 2015-10-02; просмотров: 64 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
дебиеттер | | | Хід виконання роботи. |