Результаты выполнения программ

ЦЕЛЬ РАБОТЫ

Изучить возможности использования программного интерфейса приложений (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. Изучили работу процессов и потоков с разными приоритетами. Все результаты проделанной работы представлены в данном отчёте.

Наши рекомендации