РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРОГРАММ

ЦЕЛЬ РАБОТЫ

Изучить возможности использования программного интерфейса приложений (API) операционной системы Windows. Приобрести практические навыки создания и управления процессами и потоками, используя Win API в средах программирования Borland Delphi, C++ Builder или Visual Studio.

 

ПОСТАНОВКА ЗАДАЧИ

Написать программу Sort, реализующую следующий алгоритм:

1. Зафиксировать время начала выполнения;

2. Вывести на экран время в формате: m:s:ms;

3. Зафиксировать текущий момент времени t1;

3.1. Для i от 1 до 100 повторять:

3.2. Заполнить массив целых чисел случайными значениями из диапазона 0-10000;

3.3. Отсортировать массив;

4. Зафиксировать текущий момент времени t2;

5. Определить среднее время одной сортировки: (t2 - t1) / 100;

6. Вывести на экран среднее время одной сортировки (в ms);

7. Зафиксировать время окончания выполнения программы;

8. Вывести на экран время в формате: m:s:ms.

Написать программу Master, выполняющую следующие действия:

1.Для i от 1 до 3 повторять:

1.1. Используя системные вызовы CreateProcess, создать два процесса Sort с классами приоритетов, в соответствии с вариантом задания. Необходимо, чтобы каждый процесс имел собственную консоль и окно консоли имело заголовок: "Процесс: NP; Приоритет: PP", где NP – номер процесса (1 или 2), а PP – приоритет соответствующего процесса (для изменения свойств окна консоли использовать структуру STARTUPINFO);

1.2. Ожидать окончания процессов (использовать функцию WaitForSingleObject);

2.Зафиксировать для отчета значения времени, получаемые при выполнении процессов.

Написать программу Threads, содержащую процедуру сортировки массива, содержащего N/50 элементов и процедуру вывода массива на экран – printArray. Программа должна выполнять следующие действия:

1. Генерировать случайный массив, содержащий N/50 элементов;

2. Используя системные вызовы CreateThread, создать программные потоки sort и printArray в приостановленном состоянии;

3. Установить приоритеты потоков, используя системный вызов SetThreadPriority.

4. Активизировать потоки, используя системные вызовы ResumeThread;

5. Изменяя приоритеты потоков в разработанной программе в различных сочетаниях фиксировать получаемые результаты.

ТЕКСТЫ ПРОГРАММ

Sort.cpp

#include <iostream>

#include <windows.h>

#include <locale>

#include <conio.h>

 

#define QUANTITY 1000

#define N 3500

 

using namespace std;

 

void sort(int * arr, int n)

{

 

int max;

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

{

max = i;

for (int j = i + 1; j < n; j++)

if (arr[j] < arr[max])

max = j;

 

swap(arr[i], arr[max]);

}

}

 

int getTimeInMS(SYSTEMTIME time)

{

return time.wDay * 24 * 60 * 60 * 1000 +

time.wHour * 60 * 60 * 1000 +

time.wMinute * 60 * 1000 +

time.wSecond * 1000 +

time.wMilliseconds;

}

 

int main(int argc, char * argv[])

{

setlocale(LC_ALL, "");

SYSTEMTIME timeStart, timeEnd, t1, t2;

 

GetSystemTime(&timeStart);

 

cout << "Начало выполнения: " << timeStart.wMinute << ":" << timeStart.wSecond << ":" << timeStart.wMilliseconds << endl;

 

int arr[N];

 

GetSystemTime(&t1);

srand(time(NULL));

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

{

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

arr[j] = rand() % 10000;

 

sort(arr, N);

}

GetSystemTime(&t2);

 

cout << "Среднее время одной сортировки: " << ( (getTimeInMS(t2) - getTimeInMS(t1)) / QUANTITY ) << " ms" << endl;

 

GetSystemTime(&timeEnd);

cout << "Конец выполнения: " << timeEnd.wMinute << ":" << timeEnd.wSecond << ":" << timeEnd.wMilliseconds << endl;

 

getch();

 

return 0;

}

Master.cpp

#include <iostream>

#include <windows.h>

#include <cstdio>

#include <clocale>

 

using namespace std;

 

char * prioritiesString[] = {

"IDLE_PRIORITY_CLASS",

"HIGH_PRIORITY_CLASS",

"IDLE_PRIORITY_CLASS",

"IDLE_PRIORITY_CLASS",

"NORMAL_PRIORITY_CLASS",

"IDLE_PRIORITY_CLASS"

};

 

 

WORD prioritiesWORD[] = {

IDLE_PRIORITY_CLASS,

HIGH_PRIORITY_CLASS,

IDLE_PRIORITY_CLASS,

IDLE_PRIORITY_CLASS,

NORMAL_PRIORITY_CLASS,

IDLE_PRIORITY_CLASS

};

 

int main(int argc, char * argv[])

{

 

setlocale(LC_ALL, "");

 

char stringFirst[32];

char stringSecond[32];

 

for (int i = 1, j = 0; i <= 3; i++, j += 2)

{

STARTUPINFO consoleInfo1, consoleInfo2;

PROCESS_INFORMATION processInfo1, processInfo2;

 

ZeroMemory(&consoleInfo1, sizeof(consoleInfo1));

ZeroMemory(&consoleInfo2, sizeof(consoleInfo2));

 

sprintf(stringFirst, "Ïðîöåññ: 1; Ïðèîðèòåò: %s", prioritiesString[j]);

 

consoleInfo1.lpTitle = stringFirst;

consoleInfo1.cb = sizeof(consoleInfo1);

 

CreateProcess(NULL,

"Sort.exe",

NULL,

NULL,

FALSE,

CREATE_NEW_CONSOLE | prioritiesWORD[j],

NULL,

NULL,

&consoleInfo1,

&processInfo1);

 

sprintf(stringSecond, "Ïðîöåññ: 2; Ïðèîðèòåò: %s", prioritiesString[j + 1]);

 

consoleInfo2.lpTitle = stringSecond;

consoleInfo2.cb = sizeof(consoleInfo2);

 

CreateProcess(NULL,

"Sort.exe",

NULL,

NULL,

FALSE,

CREATE_NEW_CONSOLE | prioritiesWORD[j + 1],

NULL,

NULL,

&consoleInfo2,

&processInfo2);

 

WaitForSingleObject(processInfo1.hProcess, INFINITE);

WaitForSingleObject(processInfo2.hProcess, INFINITE);

}

 

return 0;

}

Threads.cpp

#include <iostream>

#include <clocale>

#include <ctime>

#include <windows.h>

 

#define N (3500/50)

 

using namespace std;

 

int arr[N];

 

void printArray()

{

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

cout << arr[i] << " ";

 

cout << endl;

}

 

void sort()

{

int max;

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

{

max = i;

for (int j = i + 1; j < N; j++)

if (arr[j] < arr[max])

max = j;

 

swap(arr[i], arr[max]);

}

}

 

int main()

{

setlocale(LC_ALL, "");

HANDLE threadSort, threadPrint;

DWORD idSort, idPrint;

 

srand(time(NULL));

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

arr[i] = rand() % 10000;

 

threadSort = CreateThread(NULL,

0,

(LPTHREAD_START_ROUTINE)&sort,

NULL,

CREATE_SUSPENDED,

&idSort

);

 

threadPrint = CreateThread(NULL,

0,

(LPTHREAD_START_ROUTINE)&printArray,

NULL,

CREATE_SUSPENDED,

&idPrint

);

 

SetThreadPriority(threadSort, THREAD_PRIORITY_NORMAL);

SetThreadPriority(threadPrint, THREAD_PRIORITY_NORMAL);

 

ResumeThread(threadSort);

ResumeThread(threadPrint);

 

system("pause");

}

РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ ПРОГРАММ

Рисунок 1 – Результат выполнения программы Threads.exe

threadSort, THREAD_PRIORITY_HIGHEST

threadPrint, THREAD_PRIORITY_IDLE

 

Рисунок 2 – Результат выполнения программы Threads.exe

threadSort, THREAD_PRIORITY_IDLE

threadPrint, THREAD_PRIORITY_HIGHEST

 

Рисунок 3 – Результат выполнения программы Threads.exe

threadSort, THREAD_PRIORITY_NORMAL

threadPrint, THREAD_PRIORITY_ NORMAL

 

Рисунок 4 – Результат выполнения программы Master.exe (работают первые 2 процесса)

Рисунок 5 – Результат выполнения программы Master.exe (работают вторые 2 процесса)

Рисунок 6 – Результат выполнения программы Master.exe (работают последние 2 процесса)

 

ВЫВОДЫ

В ходе лабораторной работы были изучены возможности использования программного интерфейса приложений (API) операционной системы Windows. Приобрели практические навыки создания и управления процессами и потоками, используя Win API в среде программирования С++ Builder. Изучили работу процессов и потоков с разными приоритетами. Все результаты проделанной работы представлены в данном отчёте.