Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Простые часы отстают. Причина? (http://www.flasher.ru/forum/showthread.php?t=129173)

Sprynk 26.08.2009 14:32

Простые часы отстают. Причина?
 
Следующий код работаетб но время отстает примерно на 1с/в мин:

Код AS3:

var now:Date = new Date();
var oneSec:uint = 1000;
var oneSecT:Timer = new Timer(oneSec,0);
 
        clk_field.appendText(now.hours+':'+now.minutes+':'+now.seconds);
 
        oneSecT.addEventListener(TimerEvent.TIMER, onTick);
        oneSecT.start();
 
        function onTick(event:TimerEvent):void{
                now.setTime(now.getTime()+oneSec);
                clk_field.replaceText(0,8,String(now.hours+':'+now.minutes+':'+now.seconds));
        }

Не могу понять причиныб наверное какая-то тонкость. Спасибо за внимание.

random13 26.08.2009 14:35

первое: оформите код иначе разговаривать не будут
второе: во флеше таймер имеет такое свойство врать и очень зависим от производительности компьютера

kolypaev 26.08.2009 15:35

могу посоветовать использовать Event.ENTER_FRAME и скипать лишние кадры.
т.е. например флеха рааботает 24 кадра в секунду. Нужно создать переменную, которая будет увеличиваться на 1 каждый раз. И когда переменная равна 24, т.е. 1 кадр в секнду, выполняем нужный код. и обнуляем переменную, которая считает кадры.
Аналогичным образом можно сделать выполнение кода не раз в секнуд, а расчитать на любое время.

Gaen 26.08.2009 15:39

Таймер врёт, с этим придётся смириться.
Чтобы ошибка не накапливалась, при запуске таймера нужно запомнить текущее время, и при срабатываии таймера вычислять, сколько времени реально прошло.

iflamberg 26.08.2009 15:50

2kolypaev:
enterFrame еще более неточный, чем Timer и getTime.

отречься от таймера надобно и обратиться к силе new Date().

ToRR 26.08.2009 16:00

а если юзер ручками переведет дату между двумя new Date().time?
ps: а как с точностью у flash.utils.getTimer() ?

Sprynk 26.08.2009 16:43

Спасибо за советы. У меня получилась след. версия:
Код AS3:

var oneSecT:Timer = new Timer(1000);
 
        oneSecT.addEventListener(TimerEvent.TIMER, onTick);
        oneSecT.start();
 
        function onTick(event:TimerEvent):void{
                var now = new Date();
                clk_field.replaceText(0,8,String(now.hours+':'+now.minutes+':'+now.seconds));
        }

Все работает, но на мой взгляд *порнушно* как-то. Иногда секунды скачут не в такт, если таймер поставить на 200 или меньше, то секунды тикают как надо:)
А можно ли вытащить системное время без конструктора?
И нужно ли удалять экземпляр now?
Не засораю ли я память все новыми и новыми экземплярами?

Gaen 26.08.2009 17:06

Всё нормально :)
Экземпляр now объявляется как локальная переменная, ссылка на которую теряется после выхода из функции, поэтому мусорщик спокойно соберёт его.

iflamberg 27.08.2009 12:53

я б вообще не на таймер это вешал, а на enterFrame.

Sprynk 29.08.2009 13:21

Выяснил главное - таймеру верить нельзя.
Собственно, тема закрыта.


Часовой пояс GMT +4, время: 07:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.