Список форумов Шадринский форум -> Программирование -> PHP, PERL, HTML, CSS etc -> Вопрос по Pascal
Начать новую тему   Ответить на тему   вывод темы на печать

Вопрос по Pascal

Автор
Сообщение
vojager
Запомнил кнопки...


Пол: Пол:Муж.
Зарегистрирован: 23.01.2007
Сообщения: 150
Откуда: GB

Статус: Offline
СообщениеДобавлено: 2007.04.05 18:03.20
Ответить с цитатой
Я использую процедуру delay( ); для задержки выполнения программы. Но часто бывает, что на разных компах она работает поразному, т. е. где-то задержка больше, где-то меньше.
А почему так бывает?
И можно ли сделать так чтоб процедура работала одинаково на всех компах?
_________________
Under the sky of dust.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2007.04.05 18:05.02
Ответить с цитатой
смотря в каких единицах ты её используешь. если в милисекундах, то обломись.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vojager
Запомнил кнопки...


Пол: Пол:Муж.
Зарегистрирован: 23.01.2007
Сообщения: 150
Откуда: GB

Статус: Offline
СообщениеДобавлено: 2007.04.05 21:38.33
Ответить с цитатой
Да, в милисек. использую... хм...
А из-за чего же всётаки на нескольких компах по разному? Rolling Eyes
_________________
Under the sky of dust.
Посмотреть профиль Отправить личное сообщение
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2007.04.05 22:16.26
Ответить с цитатой
В тиках он считает, поэтому и результат отличный, особенно при эмуляции доса. Да еще и ошибка была в одной из версий. Попробуйте так:

Задача 50. Для проверки эффективности программ часто требуется определять и сравнивать время их работы. Создать модуль для поддержки таймера, включая процедуры задержки и определения времени, прошедшего с некоторого установленного момента.
Постараемся сделать решение независимым от особенностей операционной системы (т.е. воспользуемся процедурой получения текущего времени, а не счетчиком времени из области данных BIOS по адресу $40:$6C).
unit UTimeOut; {модуль поддержки таймера}
                 interface
 Procedure SetTimeOut(TMilli:longint); {Установка счетчика таймера, TMilli - количество миллисекунд ("завели будильник")}
 Function GetTimeOut:boolean; {Возвращает True, если с момента установки таймера прошло не менее чем TMilli миллисекунд ("будильник звенит")}

 procedure SetTimer; {фиксирует счетчик таймера ("запустили секундомер")}
 function GetTimer:longint; {возвращает количество миллисекунд, прошедших с момента фиксации счетчика }
 procedure Wait(M:longint); {задержка на M миллисекунд}

                 Implementation
uses dos; {подключаем модуль Dos для доступа к процедуре получения текущего времени }
var    Timer:longint;{момент фиксации таймера}
TTmilli:longint;{счетчик таймера}
{------------функция ConvertTime -------------}
function ConvertTime(H,M,S,Milli:integer):longint;
 begin {функция переводит часы, минуты, секунды и миллисекунды в миллисекунды}
  ConvertTime:= longint(h)*0360000+longint(M)*0006000+
longint(s)*0000100+longint(Milli);
 end;
{------------функция GetCurrentTime -------------}
function GetCurrentTime:longint;{возвращает текущее время в миллисекундах}
   var h,m,s,milli:word;
  begin
   GetTime(h,m,s,milli);{вызов процедуры из модуля Dos для получения текущего времени}
   GetCurrentTime:=ConvertTime(h,m,s,milli);
  end;
{------------процедура Wait -------------}
procedure Wait(M:longint);
  begin
   SetTimeOut(M);{устанавливаем счетчик}
   while not GetTimeOut do;{ожидаем "звонка"}
  end;
{------------процедура SetTimer -------------}
Procedure SetTimer;
 begin Timer:=GetCurrentTime; end;
{------------функция GetTimer -------------}
function GetTimer:longint;
   var NewTime:longint;
 begin
   NewTime:=GetCurrentTime;{получаем текущее время}
{Рассчитываем количество прошедших миллисекунд с момента фиксации таймера. Учитываем возможность перехода за полночь.}
   if newTime>=Timer then Gettimer:=Newtime-Timer
   else Gettimer:=Newtime-Timer+8640000; 
end;
{------------процедура SetTimeOut -------------}
 Procedure SetTimeOut(TMilli:longint);
  begin TTMilli:=TMilli; SetTimer end;
{------------функция GetTimeOut -------------}
Function GetTimeOut:boolean;
 begin
{возвращаем True, если количество времени, прошедшего с момента фиксации таймера, превышает значение счетчика}
   if TTMilli<GetTimer then GetTimeOut:=true
   else GetTimeOut:=false;
 end;
end. {модуль завершен}


Задача 51. Сравнить скорость работы циклов For, While и Repeat.
Решение:
uses crt,uTimeOut;
var i:longint;
 begin
  clrscr;
  write('Время работы цикла For ');
  Settimer;
  for i:=1 to 100000000 do;
  writeln(getTimer,' миллисекунд');
  write('Время работы цикла While ');
  Settimer;
  i:=1; while i<=100000000 do inc(i);
  writeln(getTimer,' миллисекунд');
  write('Время работы цикла Repeat ');
  Settimer;
  i:=1; repeat inc(i) until i>100000000;
  writeln(getTimer,' миллисекунд');
  readln;
 end.
В результате выполнения данной программы (компьютер с процессором Pentium-120) на экране появятся три строки:
Время работы цикла For 769 миллисекунд
Время работы цикла While 852 миллисекунд
Время работы цикла Repeat 856 миллисекунд
На самом деле, при каждом запуске программы мы получим чуть отличные результаты, однако общая тенденция достаточно ясна.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2007.04.06 09:33.27
Ответить с цитатой
vojager писал(а):
А из-за чего же всётаки на нескольких компах по разному?
сильно мелкий квант времени, особенно в многозадачной среде, не обладающей реал-тайм спецификой. короче - нет гарантии, что твоя программа получит управление в тот момент, когда тебе надо.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
[DD]
Освоившийся


Пол: Пол:Муж.
Зарегистрирован: 21.09.2007
Сообщения: 99
Откуда: From Hell

Статус: Offline
СообщениеДобавлено: 2007.09.21 07:32.31
Ответить с цитатой
vojager писал(а):
Я использую процедуру delay( ); для задержки выполнения программы. Но часто бывает, что на разных компах она работает поразному, т. е. где-то задержка больше, где-то меньше.
А почему так бывает?
И можно ли сделать так чтоб процедура работала одинаково на всех компах?

Ответ очень прост....
Просто delay(); для задержки использует в качестве единиц не милисекунды а процессорные циклы, он забивает несколько циклов для себя и поэтому выполняется задержка, но так как на каждом проце скорость выполнения цикла различна то ответ очевиден)))

Приведу простой пример...
На домашнем компе я поставил задержку в 1000 у меня это примерно секунда, а когда принес в пед то просто устал ждать выполнения этой задержки так как дома у меня пенёк на 3ггц а в педе целерон на 1,8...
_________________
Мы рождены чтоб сказку сделать кодом...
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xapac
Писатель


Пол: Пол:Муж.
Зарегистрирован: 28.01.2006
Сообщения: 698


Статус: Offline
СообщениеДобавлено: 2007.09.22 14:20.06
Ответить с цитатой
цыклы там....
timeGetTime();

а паскаль выкинь Embarassed
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора ICQ Number
VolF
подонок


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 3043
Откуда: Rammstein, GmbH

Статус: Offline
СообщениеДобавлено: 2007.09.23 12:28.42
Ответить с цитатой
timeGetTime() звучит сильно!
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Страница 1 из 1
Начать новую тему   Ответить на тему   вывод темы на печать
Показать сообщения:   
Список форумов Шадринский форум -> Программирование -> PHP, PERL, HTML, CSS etc -> Вопрос по Pascal

 
Перейти: 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы