Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ОБЬЯВЛЯЕТСЯ КОНКУРС НА САМЫЙ ЛУЧШИЙ ОБРАТНЫЙ ТАЙМЕР (https://javascript.ru/forum/misc/24056-obyavlyaetsya-konkurs-na-samyjj-luchshijj-obratnyjj-tajjmer.html)

Livanderiaamarum 16.12.2011 18:09

ОБЬЯВЛЯЕТСЯ КОНКУРС НА САМЫЙ ЛУЧШИЙ ТАЙМЕР
 
ВНИМАНИЕ ВНИМАНИЕ!!! ОБЪЯВЛЯЕТСЯ КОНКУРС НА САМЫЙ ЛУЧШИЙ ОБРАТНЫЙ ТАЙМЕР, ПОБЕДИТЕЛЬ ПОЛУЧИТ 10WMZ ИЛИ 300ЯД

КРИТЕРИИ:

1) в GO должен быть максимум один обьект.
2) возможность задавать много таймеров и управлять ими раздельно
3) возможность управлять группой таймеров одновременно
4) возможность просмотреть текущее значение таймера в любое время
5) остановка, приостановка, перезапуск
6) возможность вызвать калбак по истечении таймера
7) возможность генерировать событие onTimerOver по истечению таймера.
8) таймер должен уметь показывать прошедшее время и оставшееся

я сам тоже участвую в конкурсе и если выиграю, то ни чего не получу)

Magneto 16.12.2011 18:13

Как не получишь? Ты сэкономишь на сникерсах 10WMZ.

Livanderiaamarum 16.12.2011 18:17

Цитата:

Сообщение от Magneto (Сообщение 143515)
Как не получишь? Ты сэкономишь на сникерсах 10WMZ.

что за намеки? типа мало)? это же так, ради интереса)

melky 16.12.2011 19:22

Цитата:

Сообщение от Livanderiaamarum (Сообщение 143512)
1) в GO должен быть максимум один обьект.

что такое GO ? написано в духе : "у меня есть функция GO и в ней (?) один объект.". что за go ?
Цитата:

Сообщение от Livanderiaamarum (Сообщение 143512)
8) таймер должен уметь показывать прошедшее время и оставшееся

??? нативные реализации ? мне это напоминает джумлу с её выводом данных с помощью таблиц.

nerv_ 16.12.2011 19:25

melky, я понял как global object. Только зачем оно надо :) Половина из описанного выше реализовано в соседней теме - Обратный таймер

Livanderiaamarum 16.12.2011 19:28

Цитата:

Сообщение от melky (Сообщение 143534)
что такое GO ? написано в духе : "у меня есть функция GO и в ней (?) один объект.". что за go ?

??? нативные реализации ? мне это напоминает джумлу с её выводом данных с помощью таблиц.

Global Object
да нативные, чтобы обычные пользователи могли посмотреть сколько на текущем таймере времени прошло и сколько осталось в одно слово. у меня это в данный момент планируется так:

timer("timerID").passed() - тут сколько прошло в этом таймере.
timer("timerID").remained() - тут сколько осталось в этом таймере.

Livanderiaamarum 16.12.2011 22:07

Цитата:

Сообщение от nerv_ (Сообщение 143536)
melky, я понял как global object. Только зачем оно надо :) Половина из описанного выше реализовано в соседней теме - Обратный таймер

вот щас вожусь с пространством имен таймеров)) сложно так) но интересно

ksa 16.12.2011 22:18

Цитата:

Сообщение от Livanderiaamarum
сложно так) но интересно

Да, таймеры они затягивают! :yes:

Livanderiaamarum 16.12.2011 22:20

Цитата:

Сообщение от ksa (Сообщение 143584)
Да, таймеры они затягивают! :yes:

и я про то, вещь нужная)) пригодится везде) буду использовать) на гитхаб выложу)

ksa 16.12.2011 22:21

Livanderiaamarum, таймеры повсюду... :haha: Пиши, пиши. :yes: Будет что детям потом передать...

Livanderiaamarum 16.12.2011 23:18

работает очень просто:

хотите создать таймер?
пишите timer(время, калбак, пеоердичность_калбака), периодичность можно не писать, по дефолту 1 секунда
создаст анонимный таймер который доступен по номеру создания, начиная с нулевого в данном случае так timer(0)

калбак принимает 2 аргумента, сколько времени осталось и сколько времени прошло.

можно создавать именованные таймеры
timer(имя, время, калбак, пеоердичность_калбака)
именованные таймеры доступны как timer('имя')

время можно задавать как в миллисекундах так и массивом в порядке [секунды, минуты, часы] . если нужны только секунды, то часы и минуты можно не писать. и.т.п.

таймеры имеют методы
.stop() //приостановка и
.start() //продолжение с текущего места

расширять можно через интерфейс timer.fx
например:
timer.fx.MyFunctionName = function(){ бла бла бла} , где таймер доступен как this

function timer (name_, time_,  call_, every_, after_){
			//ссылка на таймер
			var timer = arguments.callee,
			thisTimer,
			intervalId,
			name,
			time,
			call,
			every
			// timer.timers [] - таймеры
			// timer.fx {}  функции таймеров

			switch (typeof arguments[0])
			{
						//если первым аргументом передан обьект
						case 'object':
									log('object')



									break
						case 'string':
									//если не передано ни чего кроме строки
									if(arguments.length == 1)
									{
												//вернуть таймер по имени
												return timer.timers[arguments[0]]
									}
									else{ //иначе использовать её как идентефикатор таймера
												name  = arguments[0]
												//если второй аргумент массив
												if(arguments[1] instanceof Array)
												{
															var timeArr = arguments[1],
															s = timeArr[0],
															m = timeArr[1] || 0,
															h = timeArr[2] || 0
															time = (h*3600 + m+60 + s) * 1000
												}
												else {
															time  = arguments[1]
												}
												call  = arguments[2] || function(){}
												every = arguments[3] || 1000

												//сохранить id и запустить интервал каллера
												intervalId = setInterval(function(){
															//обновить значения таймера
															thisTimer.update()
															//вызвать калбак (осталось, прошло)
															call(thisTimer.last, thisTimer.passed)
												}, every)
												//создать таймер
												thisTimer = {
															startTime				  : (new Date()).getTime(), //время когда был запущен таймер
															time											: time,																			//на сколько установлен таймер
															last											: time,																		 //осталось
															passed									: 0,																						//прошло
															call											: call,																			//функция которая будет вызываться каждые сколько нсколько миллисекунд
															every										: every,																		//вызывать калбак каждые...
															intervalId					: intervalId,													//id интервала калбака
															__proto__						: timer.fx																//методы таймеров
												}
												//добавить таймер в список таймеров под именем таймеров
												timer.timers[name] = thisTimer

									}
									break
						case 'array':
									log('array')



									break
						case 'number':
									//если не передано ни чего кроме числа
									if(arguments.length == 1)
									{
												//вернуть таймер по номеру
												return timer.timers[arguments[0]]
									}
									time  = arguments[0]
									call  = arguments[1] || function(){}
									every = arguments[2] || 1000

									//сохранить id и запустить интервал каллера
									intervalId = setInterval(function(){
												//обновить значения таймера
												thisTimer.update()
												//вызвать калбак (осталось, прошло)
												call(thisTimer.last, thisTimer.passed)
									}, every)
									//создать таймер
									thisTimer = {
												startTime				  : (new Date()).getTime(), //время когда был запущен таймер
												time											: time,																			//на сколько установлен таймер
												last											: time,																		 //осталось
												passed									: 0,																						//прошло
												call											: call,																			//функция которая будет вызываться каждые сколько нсколько миллисекунд
												every										: every,																		//вызывать калбак каждые...
												intervalId					: intervalId,													//id интервала калбака
												__proto__						: timer.fx																//методы таймеров
									}
									//добавить таймер в список таймеров
									timer.timers.push(thisTimer)
			}

}
timer.timers = []
timer.fx = {
			//обновить значение таймера
			update			: function(){
						this.last = this.time - ((new Date()).getTime()	 - this.startTime) //осталось
						this.passed = this.time - this.last																															 //прошло
			},
			//остановить таймер
			stop				: function(){
						//остановить калбак
						clearInterval(this.intervalId)
			},
			//продолжить таймер
			start    : function(){
						//ссылка на текйщий таймер
						var thisTimer = this;
						//время запуска
						this.startTime = (new Date).getTime() - this.passed
						thisTimer.intervalId	=	setInterval(function(){
									//обновить значения таймера
									thisTimer.update()
									//вызвать калбак (осталось, прошло)
									thisTimer.call(thisTimer.last, thisTimer.passed)
						}, thisTimer.every)
			}
}





timer('myTimer' ,[0,1], function(l,q){
			log(l)
			})
timer('myTimer').stop()
timer('myTimer').start()

Livanderiaamarum 16.12.2011 23:27

в данный момент наполняю таймеры методами через timer.fx

и пишу движок таймер-селекторов. и естественно пространства имен, куда же без них;)

так же думаю запилить иерархию таймеров)
дочерние таймеры смогут приостанавливать родительские, и пораждать в свою очередь дочерние относительно себя.
в будущем планитуется сделать стек выполняющихся таймеров. точнее массив стеков. так как несколько таймеров могут выполняться одновременно. так же нужно прорабоатать систему адресации таймеров в двумерном стеке.. чтобы они могли прыгать с одного места на другое. нудно додумать иерархичность таймеров, сайчас они равны.и приоритет имеют те которые обьявленны раньше. надо это исправить. планируется перекупить несколько специалистов с разработки jQuery / так как у них неплохой опыт в разработке крупных проектов).

trikadin 16.12.2011 23:48

Цитата:

Сообщение от Livanderiaamarum
и пишу движок таймер-селекторов. и естественно пространства имен, куда же без них

так же думаю запилить иерархию таймеров)
дочерние таймеры смогут приостанавливать родительские, и пораждать в свою очередь дочерние относительно себя.
в будущем планитуется сделать стек выполняющихся таймеров. точнее массив стеков. так как несколько таймеров могут выполняться одновременно. так же нужно прорабоатать систему адресации таймеров в двумерном стеке.. чтобы они могли прыгать с одного места на другое. нудно додумать иерархичность таймеров, сайчас они равны.и приоритет имеют те которые обьявленны раньше. надо это исправить. планируется перекупить несколько специалистов с разработки jQuery / так как у них неплохой опыт в разработке крупных проектов).

Пиздец. Извините за мат)

Livanderiaamarum 17.12.2011 00:03

Цитата:

Сообщение от trikadin (Сообщение 143618)
Пиздец. Извините за мат)

300 рублей будут мои!!!!!!!111111 :nono:

))))

trikadin 17.12.2011 00:04

Livanderiaamarum, можно подумать, на них кто-то посягал...

Aetae 17.12.2011 00:11

Скажу одно: для нормального быстродейстия все таймеры должны выполняться одним единственным setTimeout'ом(ни в коем случае не setInterval'ом). Всё остальное - ваше дело.

Livanderiaamarum 17.12.2011 00:17

Цитата:

Сообщение от Aetae (Сообщение 143632)
Скажу одно: для нормального быстродейстия все таймеры должны выполняться одним единственным setTimeout'ом(ни в коем случае не setInterval'ом). Всё остальное - ваше дело.

таймеры не вполняются, выполняются калбаки. только перед калбаками выполняется
timer.update() для нужного таймера.

дело в том что у калбаков могут быть задано разное время. например кто-то захочет вызывать калбак не раз в секунду. как по дефолту,а чаще или реже....

но я с вами согласен, сделаю массив таймеров в которых не указали ИНОЕ от секунды время калбаков, и буду его вызывать одним сеттаймаутом.

так и собирался просто пока ядро пишу.

trikadin 17.12.2011 00:19

Livanderiaamarum, иди поработай, что ли. А то ты скоро ось для таймера напишешь.

Таймовс)

Livanderiaamarum 17.12.2011 00:20

Цитата:

Сообщение от trikadin (Сообщение 143640)
Livanderiaamarum, иди поработай, что ли. А то ты скоро ось для таймера напишешь.

Таймовс)

ну да, в планах облачный сервис таймеров) и серийное производство timerBook'ов )))

trikadin 17.12.2011 00:22

Цитата:

Сообщение от Livanderiaamarum
ну да, в планах облачный сервис таймеров) и серийное производство timerBook'ов )))

timePhone.

Я тогда логотипом могу посоветовать взять "текущие" часы Дали) Или надкушенные...

Livanderiaamarum 17.12.2011 00:29

Цитата:

Сообщение от trikadin (Сообщение 143644)
timePhone.

Я тогда логотипом могу посоветовать взять "текущие" часы Дали) Или надкушенные...

ну лого я думаю можно с викиликса спиздить ^__^ и немного переделать)

trikadin 17.12.2011 00:47

Цитата:

Сообщение от Livanderiaamarum
ну лого я думаю можно с викиликса спиздить ^__^ и немного переделать)

Оригинальным надо быть!

melky 17.12.2011 03:41

Цитата:

Сообщение от Aetae (Сообщение 143632)
Скажу одно: для нормального быстродейстия все таймеры должны выполняться одним единственным setTimeout'ом

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

дело в том, что время у таймеров не одно. такое легко прокатывает в анимировании - каждые 10мс (для поддержания фпс) проходиться по всем элементам анимирования выставлять им свойства. всё просто.

но тут такое не прокатывает. так как время у таймеров разное - к примеру,у одного 300мс, у второго - 350мс.

получается, что "главный таймер" (тот, что один) должен вызываться каждые 0 < x < 50мс(причем, x % 5 == 0) для того, чтобы попасть в таймер с 300мс и в таймер с 350 мс.

а что этот таймер будет делать во время того времени (к примеру, в 50,100,150мс после своего запуска), как он простаивает? вызываться каждые 50мс опять и проверять, нужен ли он кому?

этот последний абзац - брешь в стене производительности. пустой перевод процессорного времени. на двух таймерах этого не будет заметно, но в масштабах проекта (куча таймеров) это может выдать результат в виде тормозов или повышенной загруженности ЦП. как же это можно исправить? *ехидно хихикает*. не сказать чтобы я решил этот вопрос, но какие-то задатки есть :).

Цитата:

Сообщение от Livanderiaamarum (Сообщение 143639)
но я с вами согласен, сделаю массив таймеров в которых не указали ИНОЕ от секунды время калбаков, и буду его вызывать одним сеттаймаутом.

и много ли таких будет? вы после всех своих мыслей таймер рассматриваете только как "таймер обратного отсчёта"? да, я знаю, имя темы и все дела, но раз уж взялись за разработку темы, то что себя рамками ограничивать :)

nerv_ 17.12.2011 08:42

Цитата:

Сообщение от trikadin
Пиздец. Извините за мат)

Просто Livanderiaamarum взялся за самую сложную реализацию таймера, описанную Aetae здесь :)

Livanderiaamarum 17.12.2011 11:57

Цитата:

Сообщение от melky (Сообщение 143739)
вы после всех своих мыслей таймер рассматриваете только как "таймер обратного отсчёта"? да, я знаю, имя темы и все дела, но раз уж взялись за разработку темы, то что себя рамками ограничивать :)

конечно нет) по сути суть функции "выполнять что-то с переодичностью такой-то, столько-то времени, а в конце запустить то-то"

Livanderiaamarum 17.12.2011 12:04

Тут вот в чем дело, таймеры обновляются перед вызовами калбаков функцией .update() для каждого таймера. Нужно смотреть этой функцией сколько времени таймеру осталось до нуля. и если время меньше чем то через которое произойдет следующий update, то нужно поставить таймаут на это время и по его истечении остановить таймер выполнив функцию delete() и после выполнить калбак(передав в него 0 осталось, и X прошло), и выполнить функцию end() которая означает действие по исчетечении таймера.

_____
ДАЖЕ если человек укажет переодичность калбаков, а соотсветственно апдейтов 200 лет, а таймер поставит на 10 секунд то первый апдейт в любом случае срабатывает при запуске таймера)) ^__^

dmitriymar 17.12.2011 12:37

Livanderiaamarum,
у меня только один вопрос-а нахрена это нужно всем и тебе в частности,по твоему мнению?
у тебя опять приступ тщеславия?
хочешь повторить путь Solovei95? дак посмотри до чего это его довело;)

devote 17.12.2011 12:41

Цитата:

Сообщение от dmitriymar
хочешь повторить путь Solovei95? дак посмотри до чего это его довело

кстати Соловей вроде как в БЛОГ перебрался по совету трикадина =)

Livanderiaamarum 17.12.2011 13:11

Цитата:

Сообщение от dmitriymar (Сообщение 143838)
Livanderiaamarum,
у меня только один вопрос-а нахрена это нужно всем и тебе в частности,по твоему мнению?
у тебя опять приступ тщеславия?
хочешь повторить путь Solovei95? дак посмотри до чего это его довело;)

че ты несешь?

dmitriymar 17.12.2011 15:45

Цитата:

Сообщение от Livanderiaamarum
че ты несешь?

посмотри что ожидает если пойти по этой тропе:)
devote,
а толку? не думаю что там найдутся поклонники его таланта:)

melky 17.12.2011 16:34

Цитата:

Сообщение от devote (Сообщение 143839)
кстати Соловей вроде как в БЛОГ перебрался по совету трикадина =)

по моему совету же :/ ещё я подметил, что было бы неполохо доступно обьяснять всю теорию, кою он в своих постах отрывками излагает. трикадин отобрал всю славу)

Цитата:

Сообщение от dmitriymar (Сообщение 143838)
Livanderiaamarum,
у меня только один вопрос-а нахрена это нужно всем и тебе в частности,по твоему мнению?

а мне видится, что такая "система управления таймерами" будет довольно юзабельной. юзабельной в сфере совершения периодичных действий.

Цитата:

Сообщение от Livanderiaamarum (Сообщение 143833)
конечно нет) по сути суть функции "выполнять что-то с переодичностью такой-то, столько-то времени, а в конце запустить то-то"

у меня возможностей побольше :)

надеюсь, конкурс ещё не закончен. жди. мой скриптяга на подходе ) 419 строк, с комментариями. писал код с нацеливанием на сжатие в GCC в режиме Advanced Mode.

и пишется с другим подходом, нежели у тебя. писать таймер, у которого есть методы и свойства, без ООП - имхо, плохо.

trikadin 17.12.2011 17:15

Цитата:

Сообщение от melky
по моему совету же :/ ещё я подметил, что было бы неполохо доступно обьяснять всю теорию, кою он в своих постах отрывками излагает. трикадин отобрал всю славу)

Я не специально) Я его просто уйти просил) А идея про блог - твоя.

FINoM 17.12.2011 19:25

http://dev.odessite.com.ua/ag/stopwatch/ — не так давно сделал самый удобный онлайн таймер, который можно найти в сети :D

Livanderiaamarum 19.12.2011 07:23

Цитата:

Сообщение от melky (Сообщение 143876)
а мне видится, что такая "система управления таймерами" будет довольно юзабельной. юзабельной в сфере совершения периодичных действий.


у меня возможностей побольше :)

надеюсь, конкурс ещё не закончен. жди. мой скриптяга на подходе ) 419 строк, с комментариями. писал код с нацеливанием на сжатие в GCC в режиме Advanced Mode.

и пишется с другим подходом, нежели у тебя. писать таймер, у которого есть методы и свойства, без ООП - имхо, плохо.


БОЛЬШЕ ЧЕМ У МЕНЯ)??:) ну у меня плагины писать можно как минимум))
и генерировать события)) (что я щас и делаю)
а что за возможности у тебя такие каких у меня нет)?

кстати не понял в чем понт отсутствия ООП? ) с ООП проще же вроде, не?

melky 19.12.2011 22:42

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144363)
БОЛЬШЕ ЧЕМ У МЕНЯ)??:) ну у меня плагины писать можно как минимум))

плагины для таймера ? и что же там можно реализовать ? :)
генерировать события... subscribe pattern (шаблон "подписчик") ?

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144363)
а что за возможности у тебя такие каких у меня нет)?

увидишь. их немного :) мелкие удобства, увеличивающие гибкость "таймера".

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144363)
кстати не понял в чем понт отсутствия ООП? ) с ООП проще же вроде, не?

одно и то же, на мой взгляд, но без ооп замудрённей.

Dim@ 05.10.2012 16:10

Поднял тему :D :D :D :D :D :D

melky 05.10.2012 18:41

Цитата:

Сообщение от Dim@ (Сообщение 208374)
Поднял тему :D :D :D :D :D :D

ух ёпт. куда, интересно, я дел свой убер таймер? :D

Maxmaxmахimus 06.10.2012 02:45

:lol:

DimaJS 06.10.2012 09:42

melky,
Иерархия таймеров :D

Maxmaxmахimus 06.10.2012 16:35

Зачем удалили мои посты?? Н усерьезно, хотя бы скажи те кто чтобы я знал на кого зло держать ><


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