Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-73244
Hawk2
2002-05-10 11:31
2002.05.23
Маска в MaskEdit.


1-73181
Sergn
2002-05-13 21:33
2002.05.23
Отлавливать в RichEdit события drag-drop текста


4-73438
fomstas
2002-03-21 13:17
2002.05.23
Как изменить цвет рабочего стола?


1-73240
Garry
2002-05-10 10:35
2002.05.23
Как отобразить сообщение при наведении мыши на объект?


1-73250
dimmu2
2002-05-05 14:39
2002.05.23
dll на c++





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский