Работа №5. Запуск потоков функциями API
Разработать приложение, производящее вызов функций из трех различных плагинов одновременно в трех отдельных потоках. Эти три потока должны иметь одинаковый (общий) код, и запускаться функциями API CreateThread. Дополнительный параметр, передаваемый в эту функцию при создании потока, должен определять какой плагин будет вызываться в каждом из трех потоков.
В приложении также должен быть создан с использованием класса TThread дополнительный поток, который раз в секунду должен обновлять на экране скорость работы (вызовов плагинов в секунду) этих трех потоков. В приложении для этих трех потоков должна быть реализована возможность изменения их приоритета, в том числе и во время их выполнения.
В функции плагинов передавать случайные или любые постоянные параметры.
Работа №6. Использование объектов синхронизации
Разработать приложение, в котором выполняется следующий алгоритм: два параллельных потока циклически выполняют вызов плагинов из библиотек dll (согласно варианта). Каждый поток использует свой плагин. Результаты работы каждый поток помещает в общую очередь конечной длины. Третий поток забирает из очереди результаты работы плагинов и отображает их на экране в произвольной форме. Схема взаимодействия потоков приведена на рисунке:
Очередь должна быть реализована с использованием двух объектов синхронизации Семафор (для потоков 1 и 2, и для потока 3). При заполнении очереди потоки 1 и 2 должны приостанавливаться функцией ожидания. При отсутствии результатов в очереди поток 3 также должен приостанавливаться функцией ожидания. Участок кода помещения результатов в очередь должен быть оформлен с использованием объекта синхронизации Критическая секция.
Потоки должны корректно завершаться при завершении приложения. Для этого в программе нужно предусмотреть объект синхронизации Событие, меняющий свое состояние при завершении приложения. В приложении должна быть предусмотрена возможность только однократного запуска через использование объекта синхронизации Мьютекс. В случае запуска второй копии программы должно выводиться соответствующее предупреждение.
Работа №7. Работа с файлами и временем функциями API
Модифицировать приложение их работы №1 следующим образом:
— в заголовке окна через отдельный поток должны отображаться текущее значение системного времени OC Windows и серийный номер диска, на котором установлена ОС;
— результаты работы плагинов должны сохраняться в текстовый файл, каждый раз в новую строку, добавляясь к уже записанным ранее;
— работа с этим текстовый файлом должна осуществляться с использованием только функций API;
— этот текстовый файл должен размещаться в папке, предназначенной для хранения временных файлов;
— в окне приложения разместить текстовый список (ListBox, Memo или StringGrid), содержащий список имён файлов и их размеров, которые содержатся в папке для хранения временных файлов, поиск файлов для этого списка должен быть реализован с использованием API функций FindFirstFile, FindNextFile, FindClose;
— этот список должен обновляться автоматически, отслеживая изменение состава файлов в папке и изменения размеров файлов;
— отслеживание изменений должно быть реализовано с использованием функций Find(First/Next/Close)ChangeNotification или ReadDirectoryChangesW.
Работа №8. Отображаемые файлы
Реализовать два приложения, взаимодействующие через общую область памяти. Первое должно после запуска создавать общую область памяти (проекцию файла подкачки) и ожидать поступления данных. Второе приложение, с графическим интерфейсом, должно обеспечивать ввод, вывод и передачу данных через общую область памяти. Подключение к существующей проекции файла подкачки во втором приложении должно осуществляться через функцию OpenFileMapping.
— запустить первое приложение, которое переходит в режим ожидания (первое приложение может быть как консольным, так с графическим интерфейсом или вообще без окна);
— запустить второе приложение, которое запрашивает ввод данных;
— после ввода данные помещаются в общую область памяти, и первое приложение выполняет их обработку любым (одним) произвольным плагином из первой работы;
— результат обработки первым приложением также помещается в общую область памяти;
— второе приложение дожидается обработки данных и отображает результат, переходя затем опять в режим ввода новых данных;
— процесс обработки данных может повторяться произвольное число раз до завершения второго приложения;
— по завершении второго приложения, первое должно автоматически завершаться.
Синхронизацию между приложениями осуществлять через использование объектов синхронизации с именами (например, событий). Реализация работы должна позволять запускать произвольное число копий второго приложения. При этом вводить данные должно быть можно с любой копии, а результат обработки должен автоматически отображаться во всех запущенных копиях второго приложения (использовать PulseEvent).
Также во втором приложении разместить кнопку, в которой осуществить вызов любой произвольной функции API c ошибкой и отобразить текстовое описание данной ошибки с использованием функции FormatMessage. Выбор комбинации функции API и ошибки должен быть уникальным – не присутствовать в работах, сданных другими студентами.