Разработка приложения с несколькими обрабатывающими файл потоками, использующими взаимоисключение на основе критической секции без блокировки частей файла
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
Разработка приложения с несколькими обрабатывающими файл потоками, использующими взаимоисключение на основе критической секции без блокировки частей файла
Задание
приложение многопоточный взаимоисключение блокировка
Разработать приложение с тремя рабочими потоками. Первоначально по команде главный поток заполняет файл 10000 - ми трехбайтовых записей, поля каждой из которых формируются случайным образом. Каждая запись интерпретируется как цвет в модели RGB и используется для закраски квадрата, отображаемого в области рисунка диалогового окна приложения. Область рисунка окна приложения разбивается на 100100 квадратов. Записи файла отображаются на матрицу квадратов области рисунка построчно. После создания файла записей главный поток прорисовывает соответствующие им квадраты в области рисунка. Далее, по соответствующей команде запускаются одновременно три рабочих потока. Первый рабочий поток упорядочивает записи файла в порядке возрастания по первому полю (интенсивность красного цвета). Второй рабочий поток упорядочивает записи по второму полю (интенсивность зеленого цвета) в порядке возрастания при равенстве у записей первых полей. Третий рабочий поток упорядочивает записи по третьему полю (интенсивность синего цвета) в порядке возрастания при равенстве у записей первых полей и вторых полей. Упорядочение производится перестановкой двух соседних записей путем циклического продвижения по записям файла каждым из потоков. Для обеспечения взаимоисключения потоков при сравнении и перестановке соседних записей использовать критическую секцию. Блокировку файла и его частей не использовать. После каждой перестановки пары соседних записей должна происходить перерисовка соответствующей пары квадратов в области рисунка окна приложения. Остановка работы потоков производится по соответствующей команде. Предусмотрите все необходимые элементы управления в интерфейсе приложения. Для лучшего наблюдения за работой потоков предусмотрите временные задержки в их работе. Управление величиной задержки вынесите в интерфейс приложения.
1. Анализ предметной области
Для разработки приложения было решено использовать среду Microsoft Visual Studio 2010 Express, так как она на данный момент является современной, наиболее оптимизированной, удобной, а также бесплатной.
Исходя из технического задания, был разработан план, содержащий основные моменты задания и позволяющий отслеживать выполнение работы.
+ интерфейс
+ обработчики событий
+ синхронизацию потоков производить посредством критических секции
+ организовать возможность отключения всех / определенного потока
Все действия по работе с цветом и синхронизацией потоков будут организованы с помощью WinAPI-функций.
2. Интерфейс приложения
Перед созданием скриншота второй и третий поток были выключены на пару минут. Поэтому мы можем наблюдать, что часть красных пикселей была вытеснена в правую часть.
.Панель управления потоками, предоставляющая возможность включить / выключить отдельный поток
.Панель управления задержкой.
.Кнопка, позволяющая приостановить / продолжить работу сразу всех дочерних потоков
.Изображение размером 100х100 отображающее ход работы потоков.
.Индикатор хода работы потока, производящего сортировку по первой составляющей RGB-цвета.
.Индикатор хода работы потока, производящего сортировку по второй составляющей RGB-цвета.
.Индикатор хода работы потока, производящего сортировку по третьей составляющей RGB-цвета.
3. Исходный код программы
Проект состоит из одного модуля, т.к. код оптимизирован, минимизирован и не нуждается в разбиении на составляющие.
// course_work_027.cpp
#include stdafx.h
#include
#include
#include
#include stdlib.h;
#include time.h;
#define NUM 10000 // Количество пикселей
#define MAX 16581375 // Максимальное значение RGB-цвета в int-представлении
#define Randomize() srand((unsigned) time(NULL)); // Генератор случайных значений
const short X1 = 270; // Координаты квадрата, в котором выводится ход сортировки
const short X2 = 370;short Y1 = 10;short Y2 = 110;hwnd;
HINSTANCE hInst; // Для сохранения дескриптора приложения_SECTION cs; // Идентификатор критической секцииhdc = NULL; // Дескриптор полотна для рисованияrect; // Прямоугольник для позиционирования элементов управленияpause=0; // Флаг паузыcolors[10001]; // Цвет пикселейdelay=0; // Значение задержки
// Удобная функция для вывода сообщений
void ShowMessage (wchar_t* wch) {MessageBoxW (NULL, wch, wch, NULL);
}
// Генератор случайных чисел в диапазонеRandom (int range_min, int range_max)
{(double) rand() / (RAND_MAX + 1) * (range_max - range_min)+ range_min;
}
// Генератор случайных чисел от 0 до заданного значения
int Random (int range_max)
{(double) rand() / (RAND_MAX + 1) * (range_max);
}
// Возвращает текст объекта по ID
wchar_t* getText (int hItem) {
int length = GetWindowTextLength (GetDlgItem(hwnd, hItem));(length > 0)
{_t* tempChar;= (wchar_t*) GlobalAlloc (GPTR, length + 1);(hwnd, hItem, LPWSTR(tempChar), length + 1);tempChar;
}0;
}
// Потоки запросовhThread1 = NULL;hThread2 = NULL;hThread3 = NULL;
// Флаги активности потоков
bool bThrActive[3];
// Код выхода
DWORD dwExitCode;
APIENTRY WinMain (HINSTANCE hInstance,hPrevInstance,lpCmdLine,nCmdShow)
{wchar_t szAppName[]=L arbora_course_27;msg;wndclass;= hInstance;
// Инициализация критической секции(&cs);
// Создаем потоки с флагом, запуск ожидается
hThread1 = CreateThread (NULL, 0,&Thread1, NULL, CREATE_SUSPENDED, NULL);= CreateThread (NULL, 0,&Thread2, NULL, CRE