![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| Иль |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. |