nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 23 Apr 2024 09:41



Reply to topic  [ 48 posts ]  Go to page Previous  1, 2, 3, 4  Next
Отладка JS в Opera 
Author Message
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Это вполне может делать встроенный в венду firewall, или ещё какой-нибудь антивирус.


27 Dec 2014 22:59
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
jdigreze wrote:
Это вполне может делать встроенный в венду firewall, или ещё какой-нибудь антивирус.

Просто очень неожиданный эффект... так подспудно думаешь - "ну это Венда-7...
наверно во всю поддерживает HTML-5... ща всё просто реактивно взлетит на этих
гигагерцах и ядрах..."
И неожиданно видишь "розовую птицу обломинго" там где её не ждал... :lol:

_________________
iLavr


28 Dec 2014 10:09
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Я что-то тут одной JS конструкцией озадачился... :(
Code:
    myInterval = setInterval( "multiexecute()", dtimeMS ); //-- Интервал в миллисекундах;

/*
 *   multiexecute() - call from function runBinary();
 *
 */
function multiexecute() {
  if( !debug || autoDebugg ) { //- если НЕдебаггер или если авто-дебаггер
    for( var w=0; w<64; w++ ) {
         execute(); //-- выполняем код 6502
         execute(); //-- выполняем код 6502
       }
    }
}

dtimeMS выставляется равным 1 ms.

Значит получается так, если 128 вызовов execute() выполнятся быстрее, чем 1 ms, то возникнет пауза в эмуляции кода 6502.
Но вот если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?

Я к тому этим озадачился, не прервет ли таймер эмуляцию прямо в ходе исполнения очередного кода 6502?
Или функция execute() все-таки закончится нормально в этот момент?

_________________
iLavr


01 Jan 2015 05:49
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
...если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?

Оказывается, что никак JS не прервет никакую выполняющуюся функцию.

Принцип работы таймеров в JavaScript

Многие начинающие в JavaScript разработчики путают принцип работы его таймеров с принципом работы имеющейся во многих языках функции sleep. sleep приостанавливает выполнение программы на определённый промежуток времени, после чего работа продолжается с того же места, где была остановлена. В JavaScript такое невозможно, по крайней мере в браузерном JavaScript.

JavaScript язык однопоточный. Когда он выполняется в браузере, браузер никаких действий не производит. Если скрипт выполняется достаточно долго, становится заметно, что браузер "висит". Поэтому функция sleep вместе с приостановкой скрипта "вешала" бы браузер.

Вместо этого функции setTimeout/setInterval "делают отметку", что необходимо запустить некий код через столько-то миллисекунд, а скрипт продолжает работать своим чередом.
Code:
var n = 0;
setTimeout(function() {
    alert(n);  // На момент вывода сообщения n уже будет равна 5.
}, 1);  // Ставим минимально возможный интервал
n = 5;  // После установки таймера меняем значение переменной.

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

Но более неприятным оказался другой факт... :(
Quote:
Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.

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

_________________
iLavr


02 Jan 2015 06:56
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Lavr wrote:
Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
Честно сказать, у меня было такое предположение, но так как не подкреплено фактами, я тактично промолчал., итак сильно много имхи выкладываю последнее время.

Lavr wrote:
Но более неприятным оказался другой факт... :(
Quote:
Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.

Обескураживает такой подход... и нафига тогда указывать задержку в единицах мс, если выполняться это все-равно не будет... :-?
А вот хрен их знает, этих разработчиков. Может это каким-то образом связано с кроссплатформенностью HTML? :roll:


02 Jan 2015 08:38
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
jdigreze wrote:
Lavr wrote:
Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
Честно сказать, у меня было такое предположение, но так как не подкреплено фактами,
я тактично промолчал., итак сильно много имхи выкладываю последнее время.

А ты выкладывай не стесняйся! Я же на повод посоветоваться спрашиваю...
Так что мнение человека с опытом хоть какое-то направление поиска задает.

А то я погуглил на тему "как выполняется код JavaScript" - меня убедили, что сейчас быстро,
зачастую с частичной или полной компиляцией на лету...
Ну я и думаю - хотя и подозрительна дискретность в 1 мс, но кто знает - машины быстрые
сейчас, может разработчики и достигли такой точности таймера.
Хотя и в самой Венде знаю, что таймер неточный. Но в Венде-то тебя полюбому выкинет в
функцию таймера, а тут - видишь как необычно...

Так что излагай своё "имхо" не раздумывая, всё может проще поиск получится.

Я ведь случайно нашел про особенности setTimeout/setInterval, в официальных справочных
данных этого почему-то предпочитают не сообщать. :-?

_________________
iLavr


02 Jan 2015 10:07
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22566
Location: Silicon Valley
Reply with quote
Post 
Возможно неточность таймеров связана с виндой как таковой - в линухе должно быть лучше...

_________________
:dj: https://mastodon.social/@Shaos


02 Jan 2015 14:41
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Возможно неточность таймеров связана с виндой как таковой...

Похоже на то - странно было бы, если б у "интерпретатора", работающего в браузере
и под Вендой точность была бы лучше самой Венды.

Я просто немного подзабыл какую точность дают таймеры Венды, но здесь просто
+/- "лапоть" по определению.
И большинство статей про таймер в JS пишут о его неточности. :(

Но разница 1 - 12 мс всё же неприятна. Это ж ошибка "на порядок" получается... :-?

_________________
iLavr


03 Jan 2015 07:09
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Собственно, особенности таймера связаны даже не столько с Вендой, сколько
с самими браузерами и реализацией таймеров в них.
Quote:
Минимальная задержка таймера

У браузерного таймера есть минимальная возможная задержка. Она меняется примерно от нуля до 4мс в современных браузерах. В более старых она может быть больше и достигать 15мс.

По стандарту, минимальная задержка составляет 4мс. Так что нет разницы между setTimeout(..,1) и setTimeout(..,4).

Реальная частота срабатывания

Срабатывание может быть и гораздо реже
В ряде случаев задержка может быть не 4мс, а 30мс или даже 1000мс.
Большинство браузеров (десктопных в первую очередь) продолжают выполнять setTimeout/setInterval, даже если вкладка неактивна.

При этом ряд из них (Chrome, FF, IE10) снижают минимальную частоту таймера, до 1 раза в секунду. Получается, что в «фоновой» вкладке будет срабатывать таймер, но редко.
При работе от батареи, в ноутбуке — браузеры тоже могут снижать частоту, чтобы реже выполнять код и экономить заряд батареи. Особенно этим известен IE. Снижение может достигать нескольких раз, в зависимости от настроек.
При слишком большой загрузке процессора JavaScript может не успевать обрабатывать таймеры вовремя. При этом некоторые запуски setInterval будут пропущены.

Вывод: на интервал 4мс стоит ориентироваться, но не стоит рассчитывать.

_________________
iLavr


04 Jan 2015 10:57
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
Кто-нибуть знает надежный код отследить потерю фокуса всем окном, т.е.
когда всё всплывающее окно становится неактивным?

Ну надо же... :o Такая ерундовина - и прямо камень преклонения! :(
Нашел в сети библиотеку - ifvisible.js - якобы она без проблем отслеживает
активность вкладок...

Но, как выяснилось, она отслеживает то же самое: window.onblur = function(e){...

http://serkanyersen.github.io/ifvisible.js/demo.html

То есть, при переходе вкладки в неактивное состояние - эта библиотека выдает
сразу несколько сообщений "hidden", собственно, дублируя фактически window.onblur....

_________________
iLavr


04 Jan 2015 18:33
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Пару раз подходил к разбору этой задачки, но ровно ничего вразумительного и кроссплатформенного не вышло. Связано это, "как ни странно", с разной реализацией безопасности у разных браузеров, да ещё и от настроек оной зависит.

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

Возможно, к решению нужно подходить не через открытие дочерних окон, а через открытие/сокрытие элементов (типа div) одного окна, и с более мудрёным использованием css.


04 Jan 2015 22:00
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
jdigreze wrote:
Пару раз подходил к разбору этой задачки, но ровно ничего вразумительного и кроссплатформенного не вышло.

Да я сам уже много вариантов перепробовал... И не один я, как я вижу в поиске, этой проблемой озадачен.

Довольно перспективным казалось мне параллельно с window.onblur отслеживать события мыши (клик вне вкладки),
но тут другая проблема вырисовалась - окно может стать неактивным чисто от событий горячих клавиш клавиатуры...

В общем сейчас остановился на варианте - "если браузер Опера" - закрываем окно по window.onblur,
во всех других ситуациях - окно не закрывается.
И здесь опять что неприятно - в зависимости от браузера следующий вызов pop-up окна может направить новый
контент в уже открытое окно, а может и новое окно создать - что приводит к путанице с открытыми окнами.

_________________
iLavr


05 Jan 2015 08:19
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Самое неприятное, что все эти коллизии проявляются только при работе в офф-лайн с диска.

В он-лайне всё это совершенно не имеет места: 6502 CPU Emulator... - в основном всё корректно.
Всякие неприятные заморочки есть только в каких-то мелких особенностях внешнего интерфейса.

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

_________________
iLavr


05 Jan 2015 08:20
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
А если попробовать сделать HTA (Hyper Text Application)?
Решение только под венду, но в некоторых случаях очень полезное.
Из особенностей - при создании опираемся исключительно на DOM IE5 или выше. Некоторые защитные механизмы при этом не работают.

P.S. Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.


05 Jan 2015 22:38
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
jdigreze wrote:
Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.

Да - мутят они там свои скрипты, как всё отлажу, займусь тем чтобы отключать их приблуды
через 1..3 секунды после старта страницы.

Совсем выкидывать нельзя, это условие "бесплатности" их хостинга.

У меня видно вот такое всплывающее окно:

Image

Ну и по тексту замечаю, что они вставляют в HTML-код 2 своих скрипта:
В начале:
Code:
<script type="text/javascript" src="/abnl/?adsdata=QrLRhLjsUAjuxdH^zgg79lmeAgglQ92xJQv2wTka;psGQ3C9j2GKRbbEWPx20KtFmz;yYFxEAcvuyFstBwz^1Xx3Hrgh0y!E2UPWL1kamFiBFWxZTscyYczxaIZ^5VvvOJN7sR4sjpgu8Nu3CeXK3uINXqj7mEQnKrUFvygW^tGSHQcAiS;1QfkeZqyE26aUWebv65z57cY74FS4JIZrbs1LkUoo"></script>

И в самом конце документа:
Code:
<div><script type="text/javascript">var script = document.createElement("script");script.src="/stat/dspixel.js?ab=uc&cl="+window.location.href+"&bcn="+navigator.appCodeName+"&bn="+navigator.appName+"&bv="+navigator.appVersion+"&ce="+navigator.cookieEnabled+"&bl="+navigator.language+"&np="+navigator.platform+"&sw="+screen.width+"&sh="+screen.height+"&r="+Math.random();document.getElementsByTagName("head")[0].appendChild(script);</script></div>

_________________
iLavr


06 Jan 2015 07:53
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 48 posts ]  Go to page Previous  1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 30 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.