Авторизация



Счетчики

брус цена

Обмен ссылками

Блог программиста
Главная Стандартный C++ Функции delay и sleep: что к чему
Функции delay и sleep: что к чему PDF Печать E-mail
Автор: Андрей   
31.03.2009 11:05

Предисловие
Выжимки из всего нижесказанного
Художественная часть

Предисловие
Прежде всего хочу заметить, что ценность данной статьи в основном историческая, т.к. бОльшая ее часть - это описание лично моих мытарств, связанных с попыткой приостановить программу, написанную на стандартном C++ в C++ Builder'е, на промежуток времени, меньший одной секунды. Что в результате всех этих приключений я могу к настоящему моменту сказать по теме - читайте непосредственно под этими строками; как все эти изыскания проходили - изложено ниже.

Краткие выжимки по делу из всего последующего словесного многообразия
Итак, оказалось, что:

  • В среде разработки C++ Builder не существует функции delay, приостанавливающей работу программы менее, чем на секунду.
  • В Билдере существует функция sleep, приостанавливающая программу на целое число секунд (подключаемая библиотека dos.h).
  • В help'е указано, что аргумент функции sleep - время в миллисекундах. Это неправда. Если вы вписали в код своей программы sleep(100), то вам придется ждать не одну десятую секунды, а сто секунд.
  • Если вы работаете в Borland C++ 3.1, то функция delay - к вашим услугам (подключаемая библиотека - также dos.h). Строка кода delay(100); приостановит программу на одну десятую секунды.
  • Функция sleep в Borland C++ 3.1 также присутствует и приостанавливает выполнение программы на X секунд.
  • Никто, однако, не мешает вам использовать функцию Sleep из WinAPI - она остановит выполнение программы на X миллисекунд. Для ее использования вам достаточно подключить заголовочный файл windows.h. Это работает как в консольных приложениях, так и в приложениях с формами.
Таковы к настоящему моменту результаты моих изысканий. По мере появления у меня новых сведений информация будет обновляться.
Данная информация была получена при опытном исследовании сред Borland C++ Builder 6.0 и Borland C++ 3.1.

Художественное описание моих поисков истины.
Все началось с того, что при написании одной из простейших программ для этого сайта, названной мной "Летающая строка" (она находится здесь) у меня возникла совершенно непредвиденная проблема - отсутствие простой и привычной еще со времен изучения Turbo Pascal'а времен, delay. Программу я писал в C++ Билдере, в котором мне, однако, привычнее работать с формами-кнопками-диалогами, нежели с консольными приложениями. При этом я прекрасно помнил, что в далекие постсоветские времена эта функция почтила творение Бьерна Страуструпа (Bjarnt Stroustrup) своим присутствием - в версии 3.1 я ее однозначно использовал!
Ну что же - лезем в help. И обнаруживаем, что ничего путного мы там не обнаруживаем. Два абсолютно левых в нашем случае топика, ибо с DLL'ами в такой элементарной программке нам делать явно нечего.
Хорошо! По проторенной дорожке лезем в папку Include, в файл dos.h. Пробегаем глазами список функций, из всего мало-мальски подходящего обнаруживаем только sleep, над которым уже всерьез раздумываем.
Ладно! Как известно, "все уже украдено до нас!" - а значит, и эта проблема уже не раз озвучивалась в сети. Стало быть, остается только найти и прочитать! Вбиваем в гугль то sleep, то delay, читаем, все больше и больше раздражаемся... Большинство статей, как всегда, стырено из одного и того же источника и друг у друга, так что не различаются ни на орфографическую ошибку. И везде - везде! - утверждается, что функция sleep останавливает программу на n миллисекунд! Правильно, в билдеровском help'е тоже так написано, правда, по английски! (В BC++ 3.1, как позже я убедился, сказано про секунды!) При этом мои глаза утверждают обратное - строчка sleep(1) надежно останавливает течение времени в рамках отдельно взятой программы на одну секунду, а уж никак не миллисекунду! (Будьте уверены, одну от другой я отличу!) На форумах как-то тоже ничего путного не нашлось...
Хорошо же!! Хорошо!!.... (мозги к этому моменту, разумеется, уже кипят.) Лезем в Total Commander, заставляем его искать в папке Include слово delay - в качестве отдельного слова, с учетом регистра. Проверяем все найденные файлы и, не особо удивляясь, узнаем, что в основном это слово встречается в комментариях. По делу же - ни-че-го!
Одним словом, после этих и некоторых других пертурбаций я понял, что простыми средствами мне программу на приемлемо короткое время никак не притормозить, в связи с чем в код программы отправилась строка sleep(1), а строка с тех пор ползает по экрану со скоростью улитки.
Позже в хелпе я разглядел то, что раньше не замечал - из статьи, посвященной sleep'у была ссылка на SleepEx. Проследовав по ней и прочитав написанное, я обнаружил, что в кнопочно-окошечных приложениях эта функция (от двух аргументов - времени и логического условия преждевременного прерывания ожидания) вполне может останавливать программу на вожделенные миллисекунды. Чтобы не забивать голову дополнительными условиями, после указания времени можно написать что-нибудь навроде true==false и таким образом фактически оставить зависимость функции только от времени. К сожалению, консольные приложения библиотеку winbase.h, в которой и содержится эта функция, не переваривают, поэтому вопрос о возможности останавливать программу на короткие промежутки времени для меня остается открытым...
Впрочем, за абсолютную точность и полноту всего вышеизложенного я не поручусь, ибо писался сей рассказ не по горячим следам, а несколько позднее. За конкретную информацию, извлеченную мной из хелпа, интернета, подключаемых библиотек, хитросплетений собственной логики и откуда только не, я однако же могу поручиться.
...Так, однако же, случилось, что много позже я вновь влез в хелп славного Borland C++ Builder'а, выискивая там функцию sleep. Уж не знаю, где были мои глаза до этого (полагаю, на месте, но уж больно они были к тому моменту замылены...), но функция, приостанавливающая выполнение программы на несколько миллисекунд, была мной обнаружена. Это была функция Sleep родом прямо из WinAPI. И ерунда, что она с большой буквы и не совсем си-плюс-плюс-ная! Зато работает! И живет она в заголовочном файле winbase.h (впрочем, подключать windows.h все равно придется, а winbase.h внутри него итак подключен).
Итак, имеем то что имеем. И ничего с этим особо не поделать. А потому - желаю вам наиболее продуктивного использования имеющихся возможностей и не попадаться в ситуации, когда этих возможностей ну никак не хватает!
Приятного программирования!;)

Обновлено 17.02.2010 15:29