Результаты выполнения программ
ЦЕЛЬ РАБОТЫ
Изучить возможности использования программного интерфейса приложений (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. Изучили работу процессов и потоков с разными приоритетами. Все результаты проделанной работы представлены в данном отчёте.