Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

Что делать, если таймер недоступен

В ранних версиях Windows в каждый конкретный момент времени во всей системе могли быть активными только 16 таймеров. Пользователи Windows быстро обнаружили это, пытаясь запустить как можно больше программ Clock. Попытка запустить программу 17 раз приводила к появлению сообщения об ошибке "No more clocks or timers" (Нет доступных таймеров). Хотя Windows 3.0 удвоила количество допустимых таймеров до 32, а Windows 95 практически вообще сняла какие бы то ни было ограничения, включение обработки ошибок в программе Windows по-прежнему считается хорошим стилем программирования. Рассмотрим обработку таких ситуаций.

Если нет доступных таймеров, возвращаемым значением функции SetTimer является NULL. Ваша программа могла бы нормально работать и без таймера, но если таймер вам необходим (как в программе clock), то у приложения не остается выбора, как только завершиться из-за невозможности работать. Если вы вызываете в WinMain функцию SetTimer, то вы можете завершить свою программу, просто возвращая FALSE из WinMain.

Предположим, что вам нужен 1000-миллисекундный таймер. Сразу за вызовом CreateWindow, но перед циклом обработки сообщений, вы могли бы вставить следующую инструкцию:

if(!SetTimer(hwnd, 1, 1000, NULL))

return FALSE;

Но это некрасивый способ завершения программы. Пользователь останется в неведении, почему не загружается его приложение. Гораздо удобнее — и намного проще — для вывода сообщения на экран использовать окно сообщений Windows.

Окно сообщений — это всплывающее окно, которое появляется всегда в центре экрана. В окнах сообщений есть строка заголовка, но нет рамки, позволяющей изменять размеры окна. Строка заголовка обычно содержит имя приложения. Окно сообщений включает в себя само сообщение и одну, две или три кнопки (какие-либо сочетания кнопок OK, Retry, Cancel, Yes, No и других). В окне сообщений может также находиться ранее определенный значок: строчное "i" (что означает "information" — информация), восклицательный, вопросительный или запрещающий знаки. Последний представляет собой белый символ X на красном фоне (как настоящий знак "стоп"). Вы, вероятно, уже видели множество окон сообщений при работе с Windows.

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

if(!SetTimer(hwnd, 1, 1000, NULL))

{

MessageBox(hwnd,"Too many clocks or timers!","Program Name",

MB_ICONEXCLAMATION | MB_OK);

return FALSE;

}

Это окно сообщений представлено на рис. 7.1. Когда пользователь нажимает клавишу <Enter> или щелкает на кнопке OK, WinMain завершается и возвращает значение FALSE.

По умолчанию окна сообщений являются "модальными окнами приложения" (application modal). Это означает, что пользователь должен как-то отреагировать на окно сообщений перед тем, как приложение продолжит работу. Однако, пользователь может переключиться на другие приложения. Следовательно, почему бы не дать пользователю возможность закрыть одно из использующих таймер приложений и тогда уже успешно загрузить свое приложение с помощью следующего кода:

while ( !SetTimer(hwnd, 1, 1000, NULL) )

if ( MessageBox(hwnd, "Too many clocks or timers!", "Program Name",

MB_ICONEXCLAMATION | MB_RETRYCANCEL) == IDCANCEL )

return FALSE;

Окно сообщений, приведенное на рис. 7.2, имеет две кнопки с надписями Retry и Cancel. Если пользователь щелкает на кнопке Cancel, функция MessageBox возвращает значение равное IDCANCEL, и программа завершается. Если пользователь щелкает на кнопке Retry, функция SetTimer вызывается снова.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]