Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2009, 20:06   #11
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

вот почитайте
Цитата:
Часто при программировании в некоторых местах программы необходимо замерять время исполнения кода, в других просто останавливать выполнение не некоторое время. Например, если писать игру, необходимо создавать код, который бы ограничивал скорость игры. Конечно, если игра очень тяжелоя, то некоторое время она может существовать без такого ограничителя. Но со временем вычислительная мощь компютеров растет (к сожелению не сама по себе) и в игры без ограничителя скорости играть становится невозможно. Или вы решили написать бенчмарк для процессора. Тут уже нужны очень точные средства для замера времени исполнения кода. Таких примеров можно привести уйму. Проще сказать, что в любой более - мение серезной программе измерение времени просто необходимо. К сожалению штатные средства в Паскале ограничиваются только процедурой Delay что описана в модуле CRT. Но она очень сильно зависит от производительности системы. Конечно, можно использовать процедуру GetTime, но она довольно громоздка. А стандартных процедур по замеру времени выполнения кода вобще нет.

Ну и не надо! Мы ведь не чайники? Конечно, не чайники! Сами напишем. При написании программ последовательный код стараются обединить в цыклы. Код, повторяющийся в програме выносят в отдельные процедуры и функции. А код, который явно будет использоватся не в одной программе, выносят в модули. Мы так и сделаем. Давайте создадим в Паскале файл TIMER.PAS и начнем. Как известно название модуля и файла должны совпадать, поетому пишем:

Unit Timer;

Далее необходимо создать интерфейсную часть модуля. Тут давайте остановимся и разберемся что нам нужно. Во-первых нам нужны средства для измерения времени исполнения кода. Во-вторых средства по остановке программы на определенное время. Кроме того, при остановке может, понадобится вывод времени, которое прошло.

interface
procedure Start (var T:longint);
procedure Stop (var T:longint);
procedure Pause (T:longint; Show:boolean);

Итак, мы обявили три процедуры. Процедуры Start и Stop будут служить для измерения времени выполнения кода, а Pause станет заменой Delay. Переменная T - будит служить для передачи данных о времени. Show - для разрешения или запрещения вывода времени на екран. Далее следует исполнительная часть. Она служит для обявления локальных констант, переменных и типов. В данном модуле они нам не нужны:

Implementation

Далее следует самое интересное. Вы еще не задумывались каким же способом мы будем производить замер времени? А почему бы не использавать аппаратный таймер? Темболее это очень просто:

SystemTimer:longint absolute $0040:$006C;

Вот и все! Нет, модуль не весь, но мы имеем полный доступ к аапаратному таймеру, расположеному по физическому адресу $0040:$006C. Значение двойного слова по этому адресу увеличивается на единицу 18.2 раза в секунду и независит от производительности системы. Нам осталось только написать примитивные процедуры для оперирования с таймером:

procedure Start (var T:longint);
begin
T:=SystemTimer;
end;
procedure Stop (var T:longint);
begin
T:=SystemTimer-T;
end;

procedure Pause (T:longint; Show:boolean);
var Xn,Xt:longint;
begin
Xt:=0;
Xn:=SystemTimer;
While ((Xt-Xn)/18.2)*1000 < T do
begin
Xt:=SystemTimer;
If Show then
writeln((xt-xn)/18.2:6:4)
end;
end;

Ну, и долгожданный

end.

Все, компилируем. Хочется сразу проверить работу, не так ли?

Program TimerPrimer;
uses timer;
Var i : integer;
a :Real;
Time : LongInt;
begin
Randomize;
Start(Time);
For i:=1 to 30000 do
a:=Sin(sqrt(i))*Cos(sqrt(Random(100 00)));
Stop(Time);
Writeln('Время выполнения: ',Time/18.2:6:4);
Readln;
Pause(10000, True);
end.

Данная программа демонстрирует возможности модутя Timer. В начале она исполняет цыкл от 1 до 30000 в котором высчитывает значение а. Время выполнения этого цыкла и замеряют наши процедуры Start и Stop. После чего, дождавшись нажатия на Enter делаем паузу на 10.000 секунд с разрешаем процедуре Pause осуществлять вывод на екран.

Теперь вы сможете использовать точный таймер в своих программах. А почему же я не воспользовался процедурой GetTime? Только из-за ее громоздкости? Конечно нет. Посмотрите на код. Что мы собственно использовали? Только прямой доступ к физическому адресу аппаратного таймера. Так кто мешает использовать его в других языках программирования? Вот тут то и оно.

Автор: Владислав Путяк
Источник: http://docs.com.ru
вот еще Пример реализации простейших часов
Код:
uses dos,crt;
var Time:string;

Function GetTime: string;
Var h, m, s, ms: Word;
begin
Dos.GetTime(h, m, s, ms);
str(h,':',m,':',s,':',ms,time); 
GetTime:=time;
end;

begin
ClrScr;
while not keypressed do
begin
delay(100);
GoToXY(1,1);
WriteLn('TIME = ', GetTime);
end;
end.
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.

Последний раз редактировалось ОДИНОЧЕСТВО В СЕТИ; 27.06.2009 в 20:09.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 27.06.2009, 21:05   #12
NSvirus
пропагандирую жизЪ
Форумчанин
 
Аватар для NSvirus
 
Регистрация: 19.03.2007
Сообщений: 950
По умолчанию

ОДИНОЧЕСТВО В СЕТИ , эта информация уже предлагалась. смотрите выше))
Посторонним В.
NSvirus вне форума Ответить с цитированием
Старый 28.06.2009, 20:50   #13
ЯН_КА
Пользователь
 
Регистрация: 17.04.2009
Сообщений: 43
По умолчанию

delay(100);
GoToXY(1,1); на этом программировать нельзя!
ЯН_КА вне форума Ответить с цитированием
Старый 29.06.2009, 10:30   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
delay(100);
1) вышеприведённая программа будет работать, если этот Delay вообще выкинуть! Только вывод будет постоянно мерцать - т.к. время будет выводиться несколько десятков раз в секунду. Чтобы этого не было - смотрите в теме про сегментные часы - там проверялось в цикле, и, если время не поменялось, тогда и не было вывода времени на экран...

Цитата:
GoToXY(1,1); на этом программировать нельзя!
а вот скажите, Яна, это Ваше мнение, или это Вам преподаватель сказал?! и в том, и в другом случае - это просто ГЛУПОСТЬ! Дело в том, что этот оператор позиционирует вывод строки времени в позицию на экранее с координатами 1,1 и НИКАКОГО ОТНОШЕНИЯ К ОПЕРАТОРУ БЕЗУСЛОВНОГО ПЕРЕХОДА GOTO НЕ ИМЕЕТ!
Если же позиционирование курсора Вас по каким-то причинам тоже не устраивает, то пишите прямо в видеопамять.

Последний раз редактировалось Serge_Bliznykov; 29.06.2009 в 10:32.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
текущее время (системное время ) Sirk0 Общие вопросы Delphi 27 07.03.2015 17:52
Срочно и очень важно!!! Время поджимает!!!Помогите решить задачу в Паскале на зарплату lenok113 Фриланс 7 24.05.2009 22:22
Время нажатия на кнопку мыши(Время реакции) Кирилл13 Помощь студентам 1 11.04.2009 19:41
привет всем! помогите пожалуйста решить две задачи на паскале. я в паскале полный ноль. Пищенок Саша Паскаль, Turbo Pascal, PascalABC.NET 5 20.01.2009 13:46
Как в паскале регистрировать время? формулы расчёта новых координат Ustim Помощь студентам 13 05.03.2008 17:44