Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Хід виконання роботи. Задача 1. Приклад програми:

Читайте также:
  1. Аналіз балансу виконання кошторису витрат
  2. Варіанти для індивідуальної роботи.
  3. Вибір варіанту для виконання завдання
  4. ВИКОНАННЯ ІНДИВІДУАЛЬНОГО ДОМАШНЬОГО ЗАВДАННЯ
  5. Виконання курсової роботи
  6. ВИКОНАННЯ ПРАКТИЧНИХ НАВИЧОК
  7. Виконання спеціального завдання з розкриття злочинної діяльності організованої групи чи злочинної організації

Задача 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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Теоретичні відомості.| Варіанти для індивідуальної роботи.

mybiblioteka.su - 2015-2024 год. (0.006 сек.)