Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка к лабораторным работам (рус).doc
Скачиваний:
3
Добавлен:
15.11.2018
Размер:
353.79 Кб
Скачать

2.3.5. Wait -функции

Wait-функции идентифицируют объекты ядра операционной системы, которые поддерживают состояния "свободен-занят". К таким объектам относятся:

  • процессы,

  • потоки,

  • задания,

  • файлы,

  • события,

  • ожидаемые таймеры,

  • семафоры,

  • мьютексы.

Из всего семейства Wait-функцию\й чаще всего используется

DWORD WaitForSingleObject(

HANDLE hHandle, // handle to object

DWORD dwMilliseconds // time-out interval

);

где hHandle - один из перечисленных объектов, а dwMilliseconds – указывает сколько времени (в миллисекундах) поток готов ждать освобождения объекта. Если второй параметр равен INFINITE, поток будет ждать бесконечно, иначе, по истечению указанного времени поток все равно продолжит работу, независимо от того, освободился объект или нет.

Функция возвращает WAIT_OBJECT_0 при свободном объекте, WAIT_TIMEOUT - при завершении интервала времени, WAIT_FAILED- при неправильном вызове функции.

Функция WaitForMultipleObjects аналогична WaitForSingleObject с тем исключением, что позволяет ждать освобождения сразу нескольких объектов или какого-то одного из списка объектов:

DWORD WaitForMultipleObjects(

DWORD nCount ,

CONST HANDLE *lpHandles ,

BOOL fWaitAll ,

DWORD dwMilliseconds

);

Параметр определяет количество интересующих объектов ядра. Его значение должно быть в пределах от 1 до MAXIMUM_WAIT_OBJECTS (обычно 64). LpHandles – указатель на массив описателей объектов. Параметр fWaitAl равен TRUE, если ожидается освобождение всех объектов и FALSE, если достаточно освобождения какого-то одного объекта из массива. Параметр dwMilliseconds аналогичен предыдущей функции.

Существует несколько десятков Wait-функции, каждая из которых ожидает выполнение того или иного события в системе. Большинство из этих функций начинаются с префиксов Wait или MsgWait.

2.4. Задание на лабораторную работу

Написать, с использованием функций API, программу, которая выводит в окно приложения информацию, получаемую из контекста, об устройстве и метрике:

Вариант 1.

При помощи объектов синхронизации организовать программу "Светофор". На экране нарисован светофор с двумя состояниями (красны и зеленый), которые могут меняться пользователем при помощи мыши или клавиатуры. По экрану движутся объекты, которые достигнув контрольной линии останавливаются (при красном свете) либо продолжают движение (при зеленом).

Вариант 2.

Организовать синхронизацию при помощи семафоров для следующей задачи. После запуска основной программы пользователь задает максимальное число возможных копий этой программы. После чего, начинает процесс запуска программ несколько раз. Если лимит программ исчерпан, следующая запущенная программа автоматически завершает работу.

Вариант 3.

Динамически создать буфер оперативной памяти размером 1000 байт. Организовать синхронизацию двух потоков (или процессов), один из которых периодически записывает данные в буфер, другой – читает из него и выводит данные на экран в виде символов. Диапазон изменения данных выбрать из интервала [33,150]. Провести эксперименты при включенной и выключенной синхронизации.

Вариант 4.

Две программы взаимодействуют через один метафайл, содержащий векторное изображение. Причем одна программа периодически (раз в 2сек.) формирует изображение, состоящее, как минимум из 5 случайных фигур, а вторая – периодически считывает это изображение с диска и выводит его на экран. Организовать синхронизацию двух программ.

Вариант 5.

Необходимо вычислить сумму чисел от 1 до 100 000. Создать 5 потоков, каждый из которых вычисляет часть этой суммы (первый поток – от 1 до 20 000, второй – от 20 001 до 40 000 и т.д.). Организовать синхронизацию потоков таким образом, чтобы результат формировался по завершению последнего из потоков. Вывести на экран результат и времена, затраченные на вычисление каждым из потоков.

Вариант 6.

Синхронизировать работу трех программ. Одна программа отображает в своей клиентской области два объекта (например, прямоугольники или окружности). Объекты перемещаются вертикально и горизонтально под управлением двух других программ. Объекты должны учитывать изменение размеров окна, а также положение друг друга (при попадании в одну и ту же область, один из объектов останавливается, пропуская другой).

Вариант 7.

Написать программу-сервер, которая вычисляет сумму чисел, находящихся в бинарном файле на диске. Создать две программы – клиенты, которые периодически подготавливают файлы и обращаются к серверу за расчетом. Сервер должен выполнить задачу и сообщить результат клиенту. Организовать синхронную работу программ.

Вариант 8.

Программа-сервер отображает на экране шахматную доску. Две программы-клиенты перемешают по доске две шахматные фигуры. Организовать синхронизацию трех программ. Смена позиции осуществляется каждые 3 секунды.

Вариант 9.

Сымитировать работу процессингового центра. Программа сервер получает запросы от программы клиента (банкомата или магазина) с целью определения сколько денег находится на счету клиента. Если денег достаточно для операции, данная сумма списывается со счета. Другая программа – клиент периодически пополняет счет. Организовать синхронную работу приложений.