Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Секундомер. Погрешность при использовании setInterval (https://javascript.ru/forum/misc/15664-sekundomer-pogreshnost-pri-ispolzovanii-setinterval.html)

FINoM 08.03.2011 23:11

Секундомер. Погрешность при использовании setInterval
 
Пытаюсь реализовать секундомер с выводом времени с точностью до 1\100 секунды. При использовании функции setInterval возникают заметные неточности во времени (примерно каждые 30 секунд секундомер отстает на 1 секунду). Если точность уменьшить до 1\10 секунды, то отставание незаметно (по логике должен отставать на секунду каждые 5 минут).
...
hoursVal = minutesVal = secondsVal = msecondsVal = 0;
			
			var interval = setInterval(function(){
				if (msecondsVal < 99) {
					mseconds.innerText = ++msecondsVal;
				} else {
					mseconds.innerText = msecondsVal = 0;
					if (secondsVal < 59) {
						seconds.innerText = ++secondsVal;
					} else {
						seconds.innerText = secondsVal = 0;
						if (minutesVal < 59) {
							minutes.innerText = ++minutesVal;
						} else {
							minutes.innerText = minutesVal = 0;
						}
					}
				}
			},10);

Вот код. Есть мысль, что задержка происходит из-за использования свойства innerText. Пробовал использовать два интервала (один для расчета, другой для вывода), но зря.

Как обойти данную проблему?

P.S. Пробовал использовать setTimeout, погрешность осталась.

dmitriymar 08.03.2011 23:26

никак по таймерам.а код вызываемый по таймеру сколько милесекунд выполняется? 11?12?15?.... пока код не выполнится до конца выполнение кода не пойдёт повторно-хоть и время срабатывания таймера подошло и прошло.
и на разных машинах в зависимости от их мощности отставание будет различным
только увеличить шаг у таймера
отслеживать только машинное время-но если я точно помню -то там минимальное изменение значения 1 секунда

FINoM 09.03.2011 00:29

Спасибо, с машинным временем получилось.
Чтоб не плодить тем, задаю небольшой вопрос тут: как дополнить число нулями слева, например, у меня есть двузначные и однозначные числа, нужно чтоб к однозначным присобачивался ноль (7 » 07, 23 » 23).

UPD. Конечно же имею в виду встроенную функцию.

dmitriymar 09.03.2011 00:39

перевести их в строковой тип и прибавлять ноль

Aetae 09.03.2011 00:52

Как-то так:
Number.prototype.zeroFix=function(l){
   return '00000000'.concat(this).slice(-l||-2)
};
alert((9).zeroFix())

FINoM 09.03.2011 00:55

Цитата:

Сообщение от dmitriymar
перевести их в строковой тип и прибавлять ноль

Я понимаю. Я спросил о встроенной функции.

Aetae 09.03.2011 00:59

Встроенной увы нема.

FINoM 09.03.2011 01:00

Цитата:

Сообщение от Aetae
Встроенной увы нема.

Спасибо.


Часовой пояс GMT +3, время: 02:08.