Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизРасчет времени... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.014 c