ЛАБОРАТОРНАЯ РАБОТА № 1
Цель работы. Изучение средств синхронизации потоков и процессов, использование их в Windows-программах.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ:
Задание: Для приведенных ниже вариантов заданий составить многопоточную Windows-программу в среде MS Visual С++, в которой производится создание и выполнение 3 потоков: 1-й поток выполняет операции в главном окне приложения, 2-й и 3-й потоки - в другом окне (временном или дочернем). Для синхронизации работы 1-го потока с аналогичным потоком в дочернем процессе (запущенный 2-й экземпляр этого приложения) используется именованный объект синхронизации. Для синхронизации работы 2-го и 3-го потока используется неименованный объект синхронизации.
Требования к программе. В программе должно быть следующее:
- описана главная функция приложения WinMain, в которой регистрируется класс главного окна, создается и выводится это окно, организуется цикл обработки очереди сообщений приложения;
- главное окно приложения должно быть развернутым на весь экран и в заголовке содержать надпись: Лабораторная работа № 1 по СП студ. Фамилия И.О. группа <шифр>;
- в главном окне должно быть создано меню, состоящее из пунктов: Поток 1 (Запустить, Приостановить); Поток 2 (Запустить, Приостановить); Поток 3 (Запустить, Приостановить); Дочерний процесс (Запустить, Завершить);
- 1-й, 2-й и 3-й потоки должны быть созданы в приостановленном состоянии в оконных функциях (по сообщению WM_CREATE), для потоков должны быть описаны соответствующие потоковые функции, выполняющие в цикле операции в окнах согласно варианту задания. Запуск потоков в работу, их приостановка производятся при выборе соответствующих пунктов меню;
- в потоковых функциях 1-го, 2-го и 3-го потоков должны быть использованы указанные в варианте задания средства синхронизации. При захвате свободного объекта синхронизации потоковая функция выполняет операции вывода в окно заданное число раз (количество повторов) и освобождает этот объект синхронизации;
- 1-й поток выполняет операции в рабочей области главного окна, для него должен быть создан именованный объект синхронизации, доступный в других процессах. Работа этого потока синхронизируется с аналогичным потоком дочернего процесса, который представляет собой еще один запущенный экземпляр данного приложения;
- 2-й и 3-й потоки синхронизируются одним неименованным объектом синхронизации и по очереди выполняют свои операции во временном или дочернем окне;
- в качестве дочернего процесса должен быть запущен еще один экземпляр данного приложения. Т.к. 1-й поток этого экземпляра использует именованный объект синхронизации, то его работа будет синхронизироваться с аналогичным потоком предыдущего экземпляра;
- при запуске приложения необходимо проверять наличие уже запущенного экземпляра данного приложения, выдавать об этом сообщение с помощью функции MessageBox с кнопками "Да", "Нет", по выбору пользователя продолжать или завершать работу
Используемые Win32 API функции: для работы с потоками необходимо использовать функции: CreateThread, ResumeThread, SuspendThread, Sleep; для запуска дочернего процесса необходимо использовать функцию CreateProcess, а для его завершения - TerminateProcess; для синхронизации потоков необходимо использовать: Create-функции для создания объектов синхронизации, Wait-функцию для ожидания освобождения объекта, соответствующие функции освобождения объектов синхронизации.
Порядок выполнения работы:
1. Создать проект Windows-приложения.
2. В окне просмотра классов и файлов на вкладке FileView выбрать cpp-файл, затем в окне редактирования ввести исходный текст программы.
3. Создать файл с описанием ресурсов (при необходимости) с использованием редактора ресурсов.
4. Cоздать исполняемый модуль приложения - трансляция, компоновка.
5. Проверить результат работы приложения - запуск исполняемого модуля.
ВАРИАНТЫЗАДАНИЙ:
№ вар | Поток | Выводимый объект | Выполняемые действия | Кол-во повторов | Объект синхронизации |
Поток 1 (гл. окно) | Текстовая строка | Перемещается по боковой диагонали снизу-вверх и наоборот с интервалом 0,8 сек | Мьютекс | ||
Поток 2 (вр. окно) | Сектор эллипса | Перемещается в окне случайным образом с интервалом 0,6 сек | Критическая секция | ||
Поток 3 (вр. окно) | Текстовая строка | Перемещается по углам окна по часовой стрелке с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Сегмент эллипса | Перемещается по углам окна против часовой стрелки с интервалом 0,7 сек | Семафор | ||
Поток 2 (доч. окно) | Битовый образ | Перемещается слева-направо и наоборот с интервалом 0,6 сек | Мьютекс | ||
Поток 3 (доч. окно) | Текстовая строка | Перемещается сверху-вниз и наоборот с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Прямоугольная рамка | Перемещается по диагонали сверху-вниз и наоборот с интервалом 0,4 сек | Событие | ||
Поток 2 (вр. окно) | Эллипс | Перемещается по периметру окна против часовой стрелки с шагом 30 пикселей с интервалом 0,5 сек | Семафор | ||
Поток 3 (вр. окно) | Окружность | Перемещается слева-направо и наоборот с шагом 20 пикселей с интервалом 0,4 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается сверху-вниз и наоборот с шагом 10 пикселей с интервалом 0,2 сек | Ожидаемый таймер | ||
Поток 2 (доч. окно) | Текстовая строка | Перемещается по диагонали сверху-вниз и наоборот с шагом 40,30 пикселей с интервалом 0,5 сек | Событие | ||
Поток 3 (доч. окно) | Прямоугольник | Перемещается по боковой диагонали снизу-вверх и наоборот с шагом 20,15 пикселей с интервалом 0,3 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается сверху-вниз и наоборот с интервалом 0,5 сек | Мьютекс | ||
Поток 2 (вр. окно) | Битовый образ | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,4 сек | Ожидаемый таймер | ||
Поток 3 (вр. окно) | Прямоугольник с закругленны-ми краями | Перемещается в окне случайным образом с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается по периметру окна по часовой стрелке с шагом 20 пикселей с интервалом 0,3 сек | Семафор | ||
Поток 2 (доч. окно) | Эллипс | Перемещается по периметру окна против часовой стрелки с шагом 30 пикселей с интервалом 0,5 сек | Критическая секция | ||
Поток 3 (доч. окно) | Окружность | Перемещается слева-направо и наоборот с шагом 20 пикселей с интервалом 0,4 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается сверху-вниз и наоборот с шагом 10 пикселей с интервалом 0,6 сек | Событие | ||
Поток 2 (вр. окно) | Текстовая строка | Перемещается по диагонали сверху-вниз и наоборот с шагом 40,30 пикселей с интервалом 0,5 сек | Мьютекс | ||
Поток 3 (вр. окно) | Прямоугольник | Перемещается по боковой диагонали снизу-вверх и наоборот с шагом 20,15 пикселей с интервалом 0,3 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается сверху-вниз и наоборот с интервалом 0,4 сек | Ожидаемый таймер | ||
Поток 2 (доч. окно) | Битовый образ | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,6 сек | Семафор | ||
Поток 3 (доч. окно) | Прямоугольник с закругленны-ми краями | Перемещается в окне случайным образом с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается по окружности радиусом 130 пикселей по часовой стрелке на 15о с интервалом 0,4 сек | Мьютекс | ||
Поток 2 (вр. окно) | Квадрат | Перемещается слева-направо и наоборот с шагом 20 пикселей с интервалом 0,3 сек | Событие | ||
Поток 3 (вр. окно) | Сектор эллипса | Перемещается сверху-вниз и наоборот с шагом 10 пикселей с интервалом 0,2 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается по диагонали сверху-вниз и наоборот с шагом 40,30 пикселей с интервалом 0,5 сек | Семафор | ||
Поток 2 (доч. окно) | Сегмент эллипса | Перемещается по окружности радиусом 130 пикселей по часовой стрелке на 15о с интервалом 0,5 сек | Ожидаемый таймер | ||
Поток 3 (доч. окно) | Битовый образ | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,4 сек | |||
Поток 1 (гл. окно) | Прямоугольная рамка | Перемещается по диагонали сверху-вниз и наоборот с интервалом 0,5 сек | Событие | ||
Поток 2 (вр. окно) | Битовый образ | Перемещается по углам окна по часовой стрелке с интервалом 0,8 сек | Критическая секция | ||
Поток 3 (вр. окно) | Эллипс | Перемещается по углам окна против часовой стрелки с интервалом 0,4 сек | |||
Поток 1 (гл. окно) | Сегмент эллипса | Перемещается слева-направо и наоборот с интервалом 0,3 сек | Мьютекс | ||
Поток 2 (доч. окно) | Текстовая строка | Перемещается по углам окна по часовой стрелке с интервалом 0,5 сек | Событие | ||
Поток 3 (доч. окно) | Битовый образ | Перемещается по углам окна против часовой стрелки с интервалом 0,6 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается по окружности радиусом 130 пикселей по часовой стрелке на 15о с интервалом 0,5 сек | Ожидаемый таймер | ||
Поток 2 (доч. окно) | Окружность | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,4 сек | Мьютекс | ||
Поток 3 (доч. окно) | Текстовая строка | Перемещается по периметру окна против часовой стрелки с шагом 30 пикселей с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается в окне случайным образом с интервалом 0,4 сек | Мьютекс | ||
Поток 2 (вр. окно) | Прямоугольник | Перемещается по углам окна по часовой стрелке с интервалом 0,5 сек | Критическая секция | ||
Поток 3 (вр. окно) | Битовый образ | Перемещается по углам окна против часовой стрелки с интервалом 0,2 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается слева-направо и наоборот с интервалом 0,8 сек | Семафор | ||
Поток 2 (доч. окно) | Текстовая строка | Перемещается сверху-вниз и наоборот с интервалом 0,4 сек | Мьютекс | ||
Поток 3 (доч. окно) | Прямоугольник с закруглен- ными краями | Перемещается по диагонали сверху-вниз и наоборот с интервалом 0,3 сек | |||
Поток 1 (гл. окно) | Квадрат | Перемещается по боковой диагонали снизу-вверх и наоборот с интервалом 0,7 сек | Событие | ||
Поток 2 (вр. окно) | Битовый образ | Перемещается по периметру окна по часовой стрелке с шагом 20 пикселей с интервалом 0,3 сек | Семафор | ||
Поток 3 (вр. окно) | Окружность | Перемещается по диагонали сверху-вниз и наоборот с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Прямоугольник | Перемещается по боковой диагонали снизу-вверх и наоборот с интервалом 0,2 сек | Ожидаемый таймер | ||
Поток 2 (доч. окно) | Битовый образ | Перемещается по периметру окна по часовой стрелке с шагом 20 пикселей с интервалом 0,3 сек | Событие | ||
Поток 3 (доч. окно) | Прямоугольник с закругленны-ми краями | Перемещается по периметру окна против часовой стрелки с шагом 30 пикселей с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается слева-направо и наоборот с шагом 20 пикселей с интервалом 0,4 сек | Мьютекс | ||
Поток 2 (вр. окно) | Текстовая строка | Перемещается сверху-вниз и наоборот с шагом 10 пикселей с интервалом 0,2 сек | Ожидаемый таймер | ||
Поток 3 (вр. окно) | Битовый образ | Перемещается по диагонали сверху-вниз и наоборот с шагом 40,30 пикселей с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается по боковой диагонали снизу-вверх и наоборот с шагом 20,15 пикселей с интервалом 0,3 сек | Семафор | ||
Поток 2 (доч. окно) | Квадрат | Перемещается по окружности радиусом 130 пикселей по часовой стрелке на 15о с интервалом 0,5 сек | Критическая секция | ||
Поток 3 (доч. окно) | Битовый образ | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,4 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается по пери-метру окна по часовой стрелке с шагом 20 пиксе-лей с интервалом 0,3 сек | Событие | ||
Поток 2 (вр. окно) | Битовый образ | Перемещается по боковой диагонали снизу-вверх и наоборот с шагом 20,15 пикселей с интервалом 0,3 сек | Мьютекс | ||
Поток 3 (вр. окно) | Квадрат | Перемещается по окружности радиусом 130 пикселей по часовой стрелке на 15о с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,4 сек | Ожидаемый таймер | ||
Поток 2 (доч. окно) | Текстовая строка | Перемещается по боковой диагонали снизу-вверх и наоборот с интервалом 0,6 сек | Семафор | ||
Поток 3 (доч. окно) | Сектор эллипса | Перемещается в окне случайным образом с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается по углам окна по часовой стрелке с интервалом 0,8 сек | Мьютекс | ||
Поток 2 (вр. окно) | Сегмент эллипса | Перемещается по углам окна против часовой стрелки с интервалом 0,5 сек | Событие | ||
Поток 3 (вр. окно) | Битовый образ | Перемещается слева-направо и наоборот с интервалом 0,3 сек | |||
Поток 1 (гл. окно) | Прямоугольник | Перемещается по боковой диагонали снизу-вверх и наоборот с интервалом 0,4 сек | Семафор | ||
Поток 2 (доч. окно) | Текстовая строка | Перемещается по периметру окна по часовой стрелке с шагом 20 пикселей с интервалом 0,3 сек | Событие | ||
Поток 3 (доч. окно) | Битовый образ | Перемещается по периметру окна против часовой стрелки с шагом 30 пикселей с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Текстовая строка | Перемещается слева-направо и наоборот с шагом 20 пикселей с интервалом 0,4 сек | Событие | ||
Поток 2 (вр. окно) | Текстовая строка | Перемещается сверху-вниз и наоборот с шагом 10 пикселей с интервалом 0,2 сек | Ожидаемый таймер | ||
Поток 3 (вр. окно) | Прямоугольник с закруглен- ными краями | Перемещается по диагонали сверху-вниз и наоборот с шагом 40,30 пикселей с интервалом 0,5 сек | |||
Поток 1 (гл. окно) | Битовый образ | Перемещается по боковой диагонали снизу-вверх и наоборот с шагом 20,15 пикселей с интервалом 0,3 сек | Ожидаемый таймер | ||
Поток 2 (доч. окно) | Квадрат | Перемещается по окружности радиусом 130 пикселей по часовой стрелке на 15о с интервалом 0,5 сек | Мьютекс | ||
Поток 3 (доч. окно) | Битовый образ | Перемещается по окружности радиусом 180 пикселей против часовой стрелки на 10о с интервалом 0,4 сек |