Как подождать 5 секунд?
Нужно чтобы программа подождала 5 секунд и потом дальше выполняла код.
Среда разработки Lazarus (free pascal).
![]()
![]()
Однако есть тонкость: при нежелании подключении модуля Windows следует использовать команду Delay(5000); 🙂
![]()
Всё ещё ищете ответ? Посмотрите другие вопросы с метками pascal freepascal lazarus или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как сделать задержку в паскале abc
Procedure Delay(MS : Word);
Режим
Замечания
Параметр MS — число миллисекунд.
Время, на которое процедура Delay задерживает выполнение программы является приближенным значением параметра MS, так что задержка не будет длиться ровно MS миллисекунд.
Например, Delay(1000) не будет задерживать программу ровно на 1 секунду.
Известные проблемы
В фирменных версиях Turbo Pascal на современных компьютерах может возникать ошибка 200: деление на ноль , поэтому популярны патчи, устраняющие эту проблему. Самый популярный патч устраняет ошибку 200 , но при этом создаёт другую проблему: длительность Delay сильно уменьшается, непредсказуемо, причём. Большинство патчей различаются в том, как именно пропатчена процедура Delay. Помимо самого популярного патча есть и другие, увеличивающие разрядность счётчика. Попытка хороша, но работает это только в настоящей однозадачной среде DOS, а в среде Windows использовать на 100% процессор — не нормально, к тому же, процессорное время, выделенное конкретной программе, может отличаться при разной нагрузке.
Как сделать задержку в паскале abc


“Мысли о Паскале”
Автор Демьянишин Владислав
(E-mail: nitromanit@mail.ru
www: http://amonit.boom.ru)
Снятие временных характеристик программ
Бывает чрезвычайно полезно провести оценку сравнительного быстродействия частей программы. Это может иметь большое значение для достижения приемлемой производительности программы и выявления неоптимальных участков кода.
Таким образом, программисту необходим инструмент для измерения интервала времени, затрачиваемого на выполнение некоторой задачи определённым участком кода составляемой программы.
Первый метод измерения интервалов времени основан на чтении счётчика системного таймера, находящегося в области данных BIOS по адресу $0040:$006C и занимающего 4 байта памяти. Этот счётчик изменяет свои показания каждую 1/18.2 секунды, увеличиваясь на единицу.
Необходимо описать переменную, расположенную в памяти по известному адресу
Чтобы не сбить показания системных часов, не следует записывать в эту переменную что-либо. Нам лишь следует из неё читать показания системного таймера, и для этого опишем процедуру чтения этой переменной.
А вот пример использования этой процедуры:
Главное достоинство такого способа замера времени есть его простота, а его недостаток состоит в том, что точность замера интервалов времени ограничена 1/18.2 секунды, т.е. около 55 мсек.
Таким образом, если исследуемый процесс выполнится быстрее, чем за 55 мсек, то получим нулевой интервал времени. Чтобы избежать этого, можно задать цикл for с небольшим количеством повторений исследуемого процесса, чтобы выявить ничтожно малую величину времени, затраченного на выполнение данного процесса. При использовании этого способа переменной типа longint может хватить на измерение интервала продолжительностью до 32776 часов, а это около 4 лет. У кого хватит терпения ;O)
Если возникает необходимость осуществить паузу, то первое, что приходит на ум, это функция delay модуля CRT.PAS, которая осуществляет задержку выполнения программы на заданное количество миллисекунд. Но каково было моё удивление, когда я смог добиться полусекундной задержки строкой delay(50000), хотя с таким параметром должна была получиться пауза в 50 секунд. А всё потому, что на процессорах, начиная с Celeron, код этой функции работает не так как на старых процессорах.
Поэтому, хочу предложить универсальный способ осуществления задержки, который будет работать независимо от процессора x86. Вот код необходимой процедуры задержки:
При её применении паузу следует задавать в 18-х долях секунды, т.е. Pause(1) – 55 мсек, Pause(18) – одна секунда, Pause(1092) – одна минута.
Второй метод заключается в чтении счётчика канала №0 микросхемы системного таймера, который изменяется с частотой 1193180 Гц (т.е. 1193180 раз в секунду) и позволяет добиться точности в 0.838 мксек. Это реализуется простой функцией:
т.е. читаем из порта $40 сначала младший байт, а затем старший байт двухбайтного счётчика.
Но полученное таким образом значение непригодно для использования без дополнительной обработки так, как этот счётчик непрерывно уменьшается на единицу, и варьируется в пределах 0..65535 из-за того, что BIOS при загрузке компьютера устанавливает коэффициент пересчёта счётчика (регистр задвижки) данного канала в 65535. А нам необходимо нарастающее число. Следовательно, чтобы получить нарастающее число, нужно использовать выражение 65535-ReadTimerChipCount. Помимо этого необходимо ещё к полученному значению добавить количество 1/18.2 долей секунды, умноженных на коэффициент пересчёта, чтобы получить правильное значение времени. Вот функция, обеспечивающая всё необходимое:
Бесспорным достоинством этого метода является его высокая точность. А недостаток заключается в том, что переменной типа longint для хранения измеренного интервала времени может хватить на 30 минут. Хотя на практике приходится замерять интервалы времени, исчисляемые несколькими секундами.
Хочу снова вернуться к проблеме, связанной со стандартной функцией delay. А что, если попытаться создать аналог этой функции. Такую процедуру можно назвать этим же именем, но чтобы при использовании модуля CRT.PAS не возникало проблем, назовём её так:
Константа k содержит число тактов микросхемы системного таймера, проходящих за одну миллисекунду. Затем этот коэффициент умножаем на количество заданных миллисекунд, и добавляем результат к общему числу прошедших тактов микросхемы системного таймера, с тем, чтобы потом ожидать нужного нам такта. Таким образом, формируется задержка в заданное количество миллисекунд.
Определение частоты центрального процессора
Иногда возникает необходимость определить частоту процессора. В числе машинных команд имеется команда RDTSC, которая возвращает в 32-разрядных регистрах EDX:EAX количество тактов процессора, произошедших с момента его сброса. Счётчик тактов процессора является 64-разрядным и его может хватить на 585 лет при частоте CPU 1 ГГц. При включении (сбросе) процессора счётчик тактов обнуляется. Чтобы из этого счётчика вычислить частоту процессора в МГц надо измерить несколько интервалов времени, например по системному таймеру (длительностью 1/18.2 c) и получить среднюю длительность в тактах процессора. Затем умножить эту величину на 18.2 (лучше умножить на 1193180 — частота таймера в Гц и разделить на 65536 — коэффициент пересчёта микросхемы таймера и тогда получим более точное умножение на 18.2). Результат нужно разделить на 1000000, чтобы из Гц получить МГц.
Доступ к команде RDTSC контролируется флагом TSD в управляющем регистре CR4 процессора (если флаг сброшен, команда выполняется при любом уровне привилегий выполняемой программы, а если установлен — то только при уровне привилегий 0). Как показала практика, в задаче MS-DOS под Windows 98 такой метод работает нормально. Он так же работает и в реальном режиме центрального процессора, т.е если загрузить машину не Windows, а обычным MS-DOS (command prompt only).
Чтобы получить значение счётчика тактов процессора придётся повозиться, так как компилятор Turbo Pascal не знает о существовании машинной команды RDTSC. Мало того, компилятор не в состоянии компилировать простые машинные команды, использующие 32-разрядные регистры. Поэтому, в моём представлении необходимая функция может выглядеть так: