Читайте также:
|
|
Задача 1. Приклад програми:
#include <windows.h>
int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
// створення нового процесу
CreateProcess("c:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, REALTIME_PRIORITY_CLASS, NULL, NULL, &si, &pi);
// чекаємо 10 секунд
Sleep(10000);
// завершуемо процес
TerminateProcess(pi.hProcess, 0);
// чекаємо завершення створеного процесу
WaitForSingleObject(pi.hProcess, INFINITE);
// закриваємо дескриптори відкритого процесу
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}
Задача 2. В програмі для першого потоку написано функцію thread1, для другого – thread2. Для обміну даними з головною програмою використовуються глобальні змінні K, max_el та average.
Для ілюстрації паралельності роботи потоків, у відповідних функціях через кожні 500 елементів виводиться наступна інформація: номер потоку та кількість опрацьованих елементів масиву.
Приклад програми:
#include <windows.h>
#include <iostream>
#include <clocale>
using namespace std;
const int K = 5000; // кількість елементів масиву
int max_el; // змінна для зберігання максимального елемента масиву
float average = 0; // змінна для зберігання середнього арифметичного елементів масиву
// функція для знаходження максимального елемента масиву,
// котра буде викликана першим потоком
DWORD WINAPI thread1(void *_array)
{
int *a; // локальна змінна для зберігання масиву
a = static_cast<int *>(_array); // приведення типу void * до типу int *
// пошук максимального елемента
max_el = a[0];
for (int i = 0; i < K; ++i)
{
if (a[i] > max_el)
max_el = a[i];
// виводимо поточний стан роботи потоку
if ((i % (K/10)) == 0)
printf_s("\nПотiк 1. Опрацьовано елементiв: %i\n", i);
}
printf_s("Потiк 1 завершив роботу.\n");
return 0;
}
// функція для знаходження середнього арифметичного елементів масиву,
// котра буде викликана другим потоком
DWORD WINAPI thread2(void *_array)
{
int *a; // локальна змінна для зберігання масиву
a = static_cast<int *>(_array); // приведення типу void * до типу int *
// пошук середнього арифметичного елементів масиву
average = 0;
for (int i = 0; i < K; ++i)
{
average = average + a[i];
// виводимо поточний стан роботи потоку
if ((i % (K/10)) == 0)
printf_s("\nПотiк 2: Опрацьовано елементiв: %i\n", i);
}
average = average / K;
printf_s("Потiк 2 завершив роботу.\n");
return 0;
}
int main()
{
setlocale(LC_ALL, "Ukrainian");
HANDLE hThread1, hThread2; // дескриптори потоків
int TestArray[K];
// генеруємо масив випадкових чисел
for (int i = 0; i < K; ++i)
TestArray[i] = rand()%5000-2500;
// створюємо потік для знаходження максимального елемента масиву
hThread1 = (HANDLE) CreateThread(NULL, 0, thread1, (void *)TestArray, 0, NULL);
if (hThread1 == NULL)
return GetLastError();
// створюємо потік для знаходження середнього арифметичного елементів масиву
hThread2 = (HANDLE) CreateThread(NULL, 0, thread2, (void *)TestArray, 0, NULL);
if (hThread2 == NULL)
return GetLastError();
// чекаємо закінчення роботи першого потоку
WaitForSingleObject(hThread1, INFINITE);
// чекаємо закінчення роботи другого потоку
WaitForSingleObject(hThread2, INFINITE);
cout << "\nМаксимальний елемент масиву = " << max_el << endl;
cout << "\nСереднє арифметичне елементiв масиву = " << average << endl;
// закриваємо дескриптор потоку thread1
CloseHandle(hThread1);
// закриваємо дескриптор потоку thread2
CloseHandle(hThread2);
return 0;
}
Результат роботи програми:
Дата добавления: 2015-10-02; просмотров: 52 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Теоретичні відомості. | | | Варіанти для індивідуальної роботи. |