![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Расчет времени... [D5, D6, Win95/98, WinXP]
BAHO © (2002-05-07 00:23:00)Подскажите пожалуйста как решить проблему неточности таймера Delphi
Требуется написать функцию которая высчитывает сколько времени осталось до конца отрезка времени, если известно: текущее время и величина отрезка времени... И необходимо учитывать переход с 23:59:59 на 00:00:00...
Сам я эту проблему уже решил но потом пропали исходники и некак не вспомню чего же я там замутил...
Заранее спасибо...
BAHO (2002-05-13 05:22:00) [1]
> 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;
BAHO (2002-05-13 04:24:00) [2]
> Aleks1
Зато я определил какая не нужна...:)
Просто я пишу одну прогу так сказать подымаю уровень знаний
и пытаюсь как можно продуманее написать
чтобы люди которые (может быть)воспользуются
не сказали что типа гадость какая-то
или чтото типа глючная прога и программер тупой...:)
но прога я надеюсь нужная получится...
Aleks1 (2002-05-13 03:08:00) [3]>А как с точностью...?
>потерь не будет ?
"Так как с Джавдетом? Может помочь?
- Нет Джавдет мой. Встретишь - не трогай его" :)))
А что с точностью? Ты ведь пока еще ни разу не определил - какая точность тебе нужна.
BAHO (2002-05-13 02:19:00) [4]Круто...
А как с точностью...?
потерь не будет ?
Anatoly Podgoretsky (2002-05-13 01:40:00) [5]T := Now+ strtotime("10:00:00")
Далее делаешь обратный отсчет
T - Now
BAHO (2002-05-13 01:17:00) [6]Имеется ввиду что 10:00:00 это общее время а не константа...!
поэтому при уменьшении общего времени конец его не будет отдаляться с каждой секундой...
(Time+strtotime(переменная ОБЩЕЕ ВРЕМЯ))
BAHO (2002-05-13 01:13:00) [7]Есть время, допустим 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 !!!
Причем все это надо реализовать без помощи стандартных
процедур и функций... Теперь понятно...?
Anatoly Podgoretsky (2002-05-11 11:08:00) [8]Начни объяснение сначала, простыми словами и с примером того, что хочешь получить, примерно так
Есть время, допустим 10:00:00 и далее
Aleks1 (2002-05-11 03:01:00) [9]Ну вот теперь совершенно не понятно, что тебе нужно?
BAHO (2002-05-11 00:31:00) [10]Помню только что я отталкивался тока от оставшегося времени и реального...
Anatoly Podgoretsky (2002-05-10 08:32:00) [11]Лучше Now, если интервалы больше одной секунды
KilkennyCat (2002-05-10 04:56:00) [12]GetTickCount
Aleks1 (2002-05-10 02:32:00) [13]"Верной дорогой идете товарищи!"
Цитата не моя!
Если вспомнишь, то все же, лучше вернуться в старый добрый DOS.
BAHO (2002-05-10 01:43:00) [14]Ладно буду сам вспоминать помоему я на правильном пути...
Спасибо всем...
Aleks1 (2002-05-09 02:55:00) [15]Увы, ты прав :(
Windows не гонит в Реал Тайм.
Хотя "десятки" секунд - это, по-моему, перебор.
BAHO (2002-05-09 00:12:00) [16]
> ole
Ну а если система подвиснет секунд на 20
то по идее Thread ожидая своей очереди выполнения
прозевает 20 сек.
Или я не прав ?
ole (2002-05-08 09:34:00) [17]Стоит использовать не Таймер, а 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;
Это работает гораздо надежнее компонента Таймер. И точнее.
Aleks1 (2002-05-08 02:59:00) [18]Ну ты сказал, т.е. объяснил!
"время кончится гораздо позже чем 10:00:01" !!!.
Время никогда не кончится - оно вечно! (Ну сказал! Бурные апплодисменты).
Может быть тебя интересуют малые интервалы времени. (Меньше, равно периоду стандартного таймера системы)?
BAHO (2002-05-08 00:48:00) [19]Я в ассемблере не шарю...
может и згодится спасибо...
> 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;
poisn (2002-05-07 04:57:00) [20]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;
Вот написал себе таймер для игрухи, думаю он имеет очень высокую точность зависющую только от частоты твоего проца ( правда на старых машинах он не пойдет)