![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Ну вот зачем, скажете вы, мне sleep в JS. Правильно незачем. А зачем он может понадобится - правильно, не понадобится
А, всеравно, хочется иметь sleep! Определимся хоть в одном "для чего". А вот хочется рассматривать страницу и результаты тестингов в промежуточных точках останова. Однако есть alert, confirm и prompt. Это и есть настоящий кривой Sleep. Ура! Они даже независимые setInterval/Timeout останавливают. Но увы, полно кривизны. Если есть скроллинг страницы, то они его заморозят, если в alert выводится много, то и он выйдет за размер экрана, правда какая-то бродилка делает скроллинг самого алерта, но это какая-то, а не все, да и размер его тогда уже на всю страницу и под ним ничего не видно. Да и выкладывать в alert как-то не очень, даже через функцию... Преимущество - смотрю сколько захочу, пока не нажму на кнопку (их отображения еще двигать надо, чтоб страницу рассмотреть - гемор). Можно не рекурсией, а чтоб не переполнить память циклом загрузить ЦП на 99,9 процессор на какое-то время (не по событию, они тоже морозятся). Опять же умирает скроллинг (!!!) и еще я завязан на время, вдруг меня эта точка останова не интересует, а на другой хочется задержаться подольше. Ну и как понизить степень описанной кривизны? Вот: Вкладываем в окно нужные тестинги, срисовываем его и кидаем в дочернее окно, а исследуемое грузим sleep`ом через confirm("Продолжим колбаситься, друг?"). Вернее я использую prompt, чтоб иметь возможность прервать все последующие тестинги разом. Ну как мысль? Другого в JS пока ничего не подметил. -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Правда есть одна фишка.
При просмотре нельзя использовать режил табов (режим вкладок) в Gecko они морозятся напроч, как переключение между ними, так и скроллинг страницы. Это не распространяется на Maxthon и MyIE, но там переключатся между закладками можно либо клавиатурой, либо скроллингом мыши при наведении на панель табов, но никак не кликом мыши по табам. И alert, confirm и prompt там вывешивается глобально над всеми закладками и их приходится двигать при просмотре страниц. Наверно не раз наблюдали картину, когда при запуске сразу нескольких страниц во вкладках какая-то с alert напрягает просмотр. А еще поди определи с какой она страницы Добавлено @ 10:11 В смысле вываливаются алерты -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| diam |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 348 Регистрация: 23.1.2005 Где: Екатеринбург Репутация: 6 Всего: 16 |
Вообще-то, так и не понял: зачем в JavaScript нужен sleep?
Если можно, пример. Если можно, более подробный, чем
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 10 Всего: 360 |
Используй дибаггер и будет счастье
Останавливает там, где скажешь. Значения всех переменных просматриваются и меняются в любой момент времени. Вот ссылка на venkman для лисы: http://www.mozilla.org/projects/venkman/ |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Не всегда. В NN старом есть баг, связанный с этим :-) |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Aliance, в случае самодельного тестера (рука не поднимается назвать дебаггером), это не страшно, но за инфу спасибо
-------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Иль скажи мне, зачем тебе нужен usleep как в C, который заморозит текущий тред? Нет не сразу отвечай, а подумай
Надо выводить результаты каких то бесконечных вычислений? Ставим на setInterval, снимаем снепшот небходимых значений, делаем сними что нибудь. ПРавда нужно помнить что бродилки в плане JS не мультизадачны, если где то запустил бесконечный цикл, то ты вряд ли поднимешь функцию по setInterval. Надо подождать в какой то точке останова несколько секунд? Бьём длинющую функцию на несколько в каждой точке останова, ставим следующую на таймаут. Не красиво? Ну надо привыкнуть -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
ИМХО никак нельзя потому что неудобно, если я правильно все понял и если говорить о дебагере/редакторе средствами JS+.... Это ограничивает по времени просмотра, тк тайминги задаются уже строго, а также уродует код, что обязательно приведет к ошибкам из-за "забыл исправить". Внедрение остановок по клику мыши становится очень муторным (лень жуткая, хотя пара регов и вперед), еще тогда никак не сделать останов в середине функции - можно только перед вызовом вложенной. Смысл был в том чтобы делать паузы и рассматривать что на странице и чтоб alert не мешался под ногами, а не просто смотреть переменные и объекты. Я забросил вариант с выкидыванием дочерних окон (обязательно вернусь), но думаю это должно сработать. (текст выложен на правах имхи -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
А интересно было бы иметь sleep на 1 тред
Пусть у нас задача выводить элементы страницы не скопом, а с задержкой, чтобы юзверя мозги не укисли и смогли осмотреться и воспринять информацию. Пусть этих элементов с сотни две и задержка с 250мс. Что мы сделаем в JS - народим в цикле с 200 тредов и выкинем их скопом с разной сгенерированной задержкой. А что бы мы сделали с таким вот sleep - выкинули бы один тред, который не грузя систему, потихонечку претворял бы в жизнь по ноде раз в 250мс. Это так, фантазии... -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Не смог отыскать код, который писал в начале прошлого года, там как раз были нужны задержки при отправке пакетов. Фича для мозиллы. Реализовывалось очередью, т.е. ты бьёшь свой вывод на функции, затем добавляешь в очередь, один тред бежит и всё исполняет через время. В функциональном отншении ничем не отличаеться от кучи setTimeout
К сожалению в JS нельзя управять исполнением, елси бы можно было бы как нибудь дотянуться до стека вызовов функций интерпретатора, то можно было бы написать своего менеджера задачь, в котором был бы привычный многим sleep. Но для JS это из области фантастики. Я так понял тебе это нужно не для кода, а для отладки, используй дебаггер. P.S. Venkman написан на JS, надо бы узнать как они реализовали брейкпоинты, хотя бы для мозилыы можно будет это юзать. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Здорово. Отличная идея! -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Несложно предугадать, раз этод дебагер оказался на JS. ИМХО вешается плагин (или как там у них, расширение что ли) на JAVA, который добавляет в браузер методы управления точками останова и перехватывает его работу (классно, sleep организованный через объект браузера) и пишется JS под эти методы. Опять же ИМХО. Воистину, JS язык управления объектами. Вряд ли в Gecko изначально есть такие объекты/методы. -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
А ведь я, похоже, неправ про навешанные методы/объекты, ведь Venkman, он же ранее Netscape debuger, древняя штукенция. Вроде как вообще первенец.
-------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Откуда ты знаешь что он древний? По моему он появился с Gecko. Исполнением управлаяет через какой нибудь особый XPCOM обьект, надо будет посмотреть его сорцы.
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Древни, древний. Появился от с Нетшкапа и переименовали его со временем. Надо было убить 2 часа и я забрел в БиблиоГлобус (большой книжный маг около КГБ на Лубянской пл). Там выбирая себе справочник по JS (и года не прошло
Добавлено @ 18:04 Sardar, глянеш, не забудь, пожалуйста, расказать. Интересно очень -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Наткнулся и вспомнил
http://forum.vingrad.ru/index.php?showtopic=59796 Sardar, я все-таки его додумал, правда, в теории и не обкатывал совершенно за ненадобностью, поэтому только догадываюсь о накладываемые ограничения и реальности моих выводов, хоть я и использую нечто подобное. Работает он без тормозов: 1. Реализуем свой Sleep, который запускается по событию или при вызове из кода sleep(1500). Делает он всего-то, что выкидывает флаг в к-либо глобальной переменной, что якобы он запущен, а потом выставляет тайминг, который запустит его же через заданное время для снятия sleep. Или можно как для моего отладчика подвесить на определенное событие пользователя, например любая реализация кнопки "Продолжить" на экране, тк браузер не виснет. 2. Далее во все функции и обработчики вызываемые напрямую (обработчики событий, функции попадающие в тайминги) вставляется проверка на этот флаг. Причем это можно сделать только для нужных для подвешивания событий и функций. Если sleep запущен, то вызывающий контент попавшей в период действия sleep функции кидается в самодельный стек на массиве, а сама функция прерывается не приступив к своей логике. Кидаются не только параметры функций, но и, конечно же, event и this. ИМХО для сохранения лучше использовать Closures - вложенное определение function(){...} Соответственно флагом, для большей безглючности, можно временно блокировать особо замороченные события пользователя напрочь. 3. По окончании задержки или по onunload страницы Sleep раскручивает стек запуская попорядку функции с их же контентом. Еще я параноидально добавил проверку на исчезновение к-либо части контента на странице, чтоб не споткнутся, на getElementById(). Встает, конэшно, вопрос, как там будет, ведь в неподвешенном браузере можно скролить и ресайзить страницу. Какие там позиции вернет target Вот как-то так Это сообщение отредактировал(а) Иль - 30.7.2005, 11:21 -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Так, во первых хорошо бы кода немного, а то пример не ясен
Во вторых sleep это всегда была системная функция, она вырубала исполнение потока на некоторое время, затем из стека вызовов функций доставался адрес возврата и успыплённый поток возобновлял работу. В итоге не нужно было никакого дополнительного кода, просто вызов sleep. А тепер помечтаем Пусть в JS(экий новый браузер, сказавший хрен! всякой совместимости с NN/IE, либо какое нибудь другое автоматизационное окружение) у нас есть два системных обьекта:
Треды сами реализуют sleep/yield/wait/notify. Обьект FunctionCallStack интересен для "хака" JS, этот обьект отображает стек вызовов текущего треда. Также он позволяет менять обратные адреса функций! На этом можно делать блоки на уровне одного треда например. Как это может работать:
Мудрённо? Я тоже так думаю -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Код дам когда вернусь к теме, надо ж отладку еще сделать, пока только скупые идеи
А вот с такой точки зрения: Реально, есть клиентская сторона и в ней полюбэ разрешен только JS. Ждать многопоточность, а с ней, видимо, и управление тредами в JS не приходится, тк даже если это появится, то пройдет туева хуча времени, пока умрет старое семейство бродилок. Да еще много раз кто-то призадумается, а зачем это простому WEB-девелоперу. Есть только одно: "Хочу - значит могу", от этого и пляшу В JS халява с возвратом к адресу усыпленного потока понятно не катит, поэтому нужно придумать что-то, как придумали для наших однопоточных процессоров. Насколько я понял себя и других участников форума поднимающих вопрос о Sleep, то Sleep нужен не простой, а реализующий в условиях однопоточности логическую многопоточность (многозадачность). Так уж получилось меня занесло в эту степь, поэтому основываясь на опыте выложил идею. Т.е. надо-то чтоб зафиксировались состояния экрана или его части, а также выбранная часть объектной модель JS (DOM и так отдался в руки JS Забыл тогда сказать про setInterval. Если он используется и вызывает неразрешенную в периоде Sleep функцию (изменяющую состояния), то нужно предусматривать несложное управление и им/ими (приостановка и возобновление из стека), а иначе на маленьких интервалах задержек может получится, что он забьет вызываемой функцией самодельный стек, а это никчему и может даже подвесить. Буду пока зреть до имплементации -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Э не, подобные блокировки будут не только сложными в реализации, но и громоздкими и не удоными в использовании, если я тебя правильно понял.
На мой взгля лучший подход это многопотоковость + синхронизация как в Java. Мы обьявляем любой обьект в блок synchronized(обьект) и все кто попытаються использовать этот обьект уснут, пока мы не снимим блокировку(не выйдем из блока). Этот механизм наиболее популярен, от низкоуровнего программирования(семафоры/защищённые зоны), до Java/C#, где каждый обьект обладает своим «счётчиком»(семафором). В результате имеем два треда:
Таким "дедовским" методом можно гибко управлять потоками и блокировать доступ. P.S. Что то я часто мечатать начал... -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Не ждать же имплементации.
Ну и напрасненько, у меня геморойчик рулит прекрасненько В смысле подобное Не соглашусь. Чего там сложного-то? Ну нету у нас конструкторов и деструктуров, но жить-то надо. Всего-то на одну строчку в каждом обработчике больше, да + реализация логики стека. Не чувствую ни глючности, ни громозкости, ни неудобства. Наоборот, комфортно, удобно, а главное сухо Да не, ну чего я буду доказывать без сорца на руках -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 544 Регистрация: 3.3.2005 Где: Москва Репутация: 2 Всего: 14 |
Подумал и правда был неправ, это требует возьни. Я ж забыл, что по уму надо реализовать как-то чтоб Sleep умел останавливать в середине функции, а не только обрывать вызываемые после остановки. Это, ИМХО, потребует больше логики.
Я б тогда применил останов через встраиваемую функцию с сохранением контента через Closures
Не додумал как, но по идеи при раскрутке стека надо вернуться к месту "// МАРКЕР №4" и продолжить со старым контентом с него. Может через eval, может динамически менять тело функции с восстановлением потом, может раздуть код и реализовать прыжок к маркеру??? Решений несколько, но какое универсальное? Вопросов больше чем ответов, особенно пока не возьмешься за написание кода. Это пока на стадии мыслей и во что выльется и получится ли... Поторопился -------------------- Ты виндусятник?... А я да. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 78 Всего: 317 |
Похоже выход только один, вкладывать анонимные функции:
Но повторяю лучше поменять логику. Нельзя на JS программить в стиле паскаля или C, точно также с такими вещами не програмят в функциональных языках. Код при работе будет хавать память, постоянно создавая новые анонимные функции, хранящие контекст вызова. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Aliance |
|
|||
![]() I ♥ <script> ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 55 Всего: 137 |
Иль
Если правильно понял, то маркер о котором ты говорил можно применять так (только в циклах for и инструкциях switch)
Это сообщение отредактировал(а) Aliance - 15.8.2005, 20:58 |
|||
|
||||
![]()
|
| Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |