Лекции.Орг


Поиск:




Категории:

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

 

 

 

 


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

ЦЕЛЬ РАБОТЫ

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



<== предыдущая лекция | следующая лекция ==>
 | 
Поделиться с друзьями:


Дата добавления: 2017-03-18; Мы поможем в написании ваших работ!; просмотров: 414 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Логика может привести Вас от пункта А к пункту Б, а воображение — куда угодно © Альберт Эйнштейн
==> читать все изречения...

2303 - | 2226 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.