Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.23;
Скачать: CL | DM;

Вниз

Расчет времени...   Найти похожие ветки 

 
BAHO ©   (2002-05-07 00:23) [0]

Подскажите пожалуйста как решить проблему неточности таймера Delphi
Требуется написать функцию которая высчитывает сколько времени осталось до конца отрезка времени, если известно: текущее время и величина отрезка времени... И необходимо учитывать переход с 23:59:59 на 00:00:00...
Сам я эту проблему уже решил но потом пропали исходники и некак не вспомню чего же я там замутил...
Заранее спасибо...


 
Aleks1   (2002-05-07 02:12) [1]

Вспоминай как "замутил". Не вспомнишь, "замути" еще раз.


 
BAHO ©   (2002-05-07 02:44) [2]

Дельный совет...
но не лечит...мясяц мучаюсь...!


 
Aleks1   (2002-05-07 03:10) [3]

Я бы, конечно, что-нибудь подсказал, но не пойму, что именно?
1. Что есть - "неточность" таймера Delphi?
2. "Требуется написать функцию которая высчитывает сколько времени осталось до конца отрезка времени, если известно: текущее время и величина отрезка времени... И необходимо учитывать переход с 23:59:59 на 00:00:00..."
А чего тут учитывать, задай "датувремя" начала, "датувремя" конца и проверяй текущее "датавремя" с нужной.


 
poisn ©   (2002-05-07 04:57) [4]

var DelayTime:integer = 1000;
StartT,CurFREQ:extended;

function GetTime:extended;
var timerlo,timerhi:dword;
begin
asm
dw 310Fh
mov TimerLo, eax
mov TimerHi, edx
end;
Result:=(4294967296*timerhi+timerlo-StartT)/curFreq;
end;

procedure StartTimer;
var timerlo,timerhi:dword;
begin
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
StartT:=4294967296*timerhi+timerlo;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
CurFreq:=(4294967296*timerhi+timerlo)*1000/DelayTime;
end;

Вот написал себе таймер для игрухи, думаю он имеет очень высокую точность зависющую только от частоты твоего проца ( правда на старых машинах он не пойдет)


 
BAHO ©   (2002-05-08 00:48) [5]

Я в ассемблере не шарю...
может и згодится спасибо...


> Aleks1
> Что есть - "неточность" таймера Delphi?

Если делать так

var
t:tdatetime
...
t:=strtotime("10:00:01")
...
procedure Tform1.Timer1Timer(Sender: TObject);
begin
t:=t-strtotime("00:00:01");
end;

то в t время кончится гораздо позже чем 10:00:01;


 
Aleks1   (2002-05-08 02:59) [6]

Ну ты сказал, т.е. объяснил!
"время кончится гораздо позже чем 10:00:01" !!!.
Время никогда не кончится - оно вечно! (Ну сказал! Бурные апплодисменты).

Может быть тебя интересуют малые интервалы времени. (Меньше, равно периоду стандартного таймера системы)?


 
ole ©   (2002-05-08 09:34) [7]

Стоит использовать не Таймер, а Thread с достаточно высоким уровнем (типа Normal), в Execute которого описать такую вещь:
Var
E:TEvent;
...
Begin
E:=TEvent.Create(Nil,True,False,"My Event #1");
While Not Terminated Do
Begin
E.WaitFor(1000); //ждать секунду
//Здесь выполнять то, что нужно... Synchronize(...)
End;
E.Free;
End;
Это работает гораздо надежнее компонента Таймер. И точнее.


 
BAHO ©   (2002-05-09 00:12) [8]


> ole

Ну а если система подвиснет секунд на 20
то по идее Thread ожидая своей очереди выполнения
прозевает 20 сек.

Или я не прав ?


 
Aleks1   (2002-05-09 02:55) [9]

Увы, ты прав :(
Windows не гонит в Реал Тайм.
Хотя "десятки" секунд - это, по-моему, перебор.


 
BAHO ©   (2002-05-10 01:43) [10]

Ладно буду сам вспоминать помоему я на правильном пути...
Спасибо всем...


 
Aleks1   (2002-05-10 02:32) [11]

"Верной дорогой идете товарищи!"
Цитата не моя!
Если вспомнишь, то все же, лучше вернуться в старый добрый DOS.


 
KilkennyCat ©   (2002-05-10 04:56) [12]

GetTickCount


 
Anatoly Podgoretsky ©   (2002-05-10 08:32) [13]

Лучше Now, если интервалы больше одной секунды


 
BAHO ©   (2002-05-11 00:31) [14]

Помню только что я отталкивался тока от оставшегося времени и реального...


 
Aleks1   (2002-05-11 03:01) [15]

Ну вот теперь совершенно не понятно, что тебе нужно?


 
Anatoly Podgoretsky ©   (2002-05-11 11:08) [16]

Начни объяснение сначала, простыми словами и с примером того, что хочешь получить, примерно так

Есть время, допустим 10:00:00 и далее


 
BAHO ©   (2002-05-13 01:13) [17]

Есть время, допустим 10:00:00
требуется соорудить нечто вроде обратного отсчета
типа 09:59:59 09:59:58..57..56..55 и т.д.
отталкиваясь тока от общего времени (10:00:00)
и от реального Time...
причем время конца я узнаю так: Time+strtotime("10:00:00")

А требуеться узнавать каждую секунду
скока времени осталось до Time+strtotime("10:00:00")

Только нада учитывать переход времени
с 23:59:59 на 00:00:00 !!!

Причем все это надо реализовать без помощи стандартных
процедур и функций... Теперь понятно...?


 
BAHO ©   (2002-05-13 01:17) [18]

Имеется ввиду что 10:00:00 это общее время а не константа...!
поэтому при уменьшении общего времени конец его не будет отдаляться с каждой секундой...
(Time+strtotime(переменная ОБЩЕЕ ВРЕМЯ))


 
Anatoly Podgoretsky ©   (2002-05-13 01:40) [19]

T := Now + strtotime("10:00:00")
Далее делаешь обратный отсчет
T - Now


 
BAHO ©   (2002-05-13 02:19) [20]

Круто...
А как с точностью...?
потерь не будет ?


 
Aleks1   (2002-05-13 03:08) [21]

>А как с точностью...?
>потерь не будет ?

"Так как с Джавдетом? Может помочь?
- Нет Джавдет мой. Встретишь - не трогай его" :)))

А что с точностью? Ты ведь пока еще ни разу не определил - какая точность тебе нужна.


 
BAHO ©   (2002-05-13 04:24) [22]


> Aleks1

Зато я определил какая не нужна...:)
Просто я пишу одну прогу так сказать подымаю уровень знаний
и пытаюсь как можно продуманее написать
чтобы люди которые (может быть)воспользуются
не сказали что типа гадость какая-то
или чтото типа глючная прога и программер тупой...:)

но прога я надеюсь нужная получится...


 
BAHO ©   (2002-05-13 05:22) [23]


> Anatoly Podgoretsky © (13.05.02 01:40)
> T := Now + strtotime("10:00:00")
> Далее делаешь обратный отсчет
> T - Now

Попробывал...
время скачит и всё... чегото не так...

а можно подробнее
типа:
var
a:tdatetime; //Осталось времени всего

function t:tdatetime;
var
b:tdatetime; //когда закончится
begin
b:=Now+a; //узнаём когда закончится
result:=?????? //узнаём скока осталось всего
end;
...
a:=t;



Страницы: 1 вся ветка

Текущий архив: 2002.05.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.01 c
1-73165
mifi
2002-05-13 23:08
2002.05.23
рлык TO form


6-73320
Hecker
2002-02-09 01:10
2002.05.23
Кто знает как?


1-73196
sir_musatov
2002-05-14 13:32
2002.05.23
поделитесь RxLib


3-73020
ng
2002-04-26 10:43
2002.05.23
Шифровка данных


4-73458
DNT
2002-03-24 11:57
2002.05.23
Трей и мышка