Page 1 of 1

bug в wait

Posted: 03.11.2006 22:23
by CFA
дело в том что wait(N) дает задержку совсем не N миллисекунд, а заметно больше. и чем больше N тем больше погрешность.

вот скрипт

Code: Select all

var t : double;
begin
	t := now;
	wait(45000);
	t := now-t;

	addToSystemJournal(floatToStr((t)*86400000));
end.
вот его лог -

Code: Select all

1:12:15 []: Compiling
1:12:15 []: Compiled succesfully
1:13:13 []: 57830,9998149052
1:13:13 []: Succesfully executed
1:13:13 []: Script dummy.ssc stoped successfuly

1:13:45 []: Compiling
1:13:45 []: Compiled succesfully
1:14:45 []: 60034,9998800084
1:14:45 []: Succesfully executed
1:14:45 []: Script dummy.ssc stoped successfuly
бага наблюдаецо в rc1, в 0.95 погрешность тоже есть, но незначительная.

Posted: 04.11.2006 3:42
by Edred
Честно говоря, нет желания проверять твои вычисления с плавающей запятой, выведи при помощи:

Code: Select all

Function TimeToStr(Time: TDateTime): String;

Преобразовывает время из формата TDateTime в строковое представление.

Преобразование использует формат, определенный в глобальной переменной LongTimeFormat. Вы можете изменять формат отображения времени, изменяя значения переменных даты и времени (или используя Панель управления Windows).
Если эта функция есть... По идее, должна быть. Если вдруг нет, то:

Code: Select all

Procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);

Извлекает время из формата TDateTime и помещает часы, минуты, секунды, и миллисекунды соответственно в переменные Hour, Min, Sec и MSec.
Эта точно есть.

Posted: 04.11.2006 9:43
by CFA
Какие вычисления?
по простому логу видно что скрипт стартует в первом случае в 1:12:15, заканчиваеться в 1:13:13 - это 58 сек
во стором случае стартует в 1:13:45, а заканчиваеться в 1:14:45 - это 60 сек, что и подтверждаеться вычислениями. часы на компутере у меня идут весьма точно.

Posted: 06.11.2006 8:53
by Miralex
Проверю.

Posted: 19.03.2008 20:43
by MeXaon
а проблема актуальна до сих пор ;)

Stealth_v1.0 (RC 3)

Posted: 20.03.2008 18:49
by CFA
когда мне надо было точные задержки, пользовался такой процедурой

Code: Select all

procedure mWait(n : integer);
var waitTime : TDateTime;
begin
   waitTime := now + double(n) / 86400000;
   while (now < waitTime) do wait(10);
end;

Posted: 21.03.2008 3:19
by MeXaon
Ну я если честно даже не представляю где нужная настолько точная задержка во времени, ведь есть лаги... СВСы ... и т.д.

Я просто констатировал факт, что вместо ожидания 10 минут, он ждал 11+