Работает ли iframe в том же потоке, что и владелец? - PullRequest
11 голосов
/ 19 сентября 2009

У меня интенсивная работа с ЦП, и я не хочу ухудшать пользовательский опыт. Поскольку веб-работники (http://ejohn.org/blog/web-workers/) являются новой функцией и поддерживаются не всеми браузерами, я подумал открыть iframe с HTML + JS, который выполнит всю грязную работу и использует некоторые междоменные коммуникации для передачи результаты, достижения. К сожалению, я заметил, что владелец iframe страдает от работы процессора окна iframe.

Это поведение соответствует заданному? Есть ли способ решить эту проблему?

Ответы [ 2 ]

8 голосов
/ 19 сентября 2009

Один из способов имитировать многопоточность состоит в том, чтобы заставить функцию Javascript выполнить небольшую работу, а затем вызвать setTimeout с той же самой функцией; затем функция выполнит небольшую работу и снова вызовет setTimeout, и этот цикл будет продолжаться вечно или пока они не закроют кадр или пока вы не дадите сигнал прекратить работу. У MDN есть хороший пример того, как это настроить.

Между таймаутами Javascript не должен занимать процессорное время. Возможно, вам придется немного поиграть, чтобы увидеть, как долго должны быть ваши таймауты - 1 мс, вероятно, слишком короток, но 1 с определенно слишком длинен. Другим фактором будет скорость процессора компьютера, на котором выполняется задание, поэтому вам может потребоваться выполнить некоторый псевдо-бенчмаркинг на стороне клиента с помощью Javascript, прежде чем вы сможете определить, как долго задерживать каждый раз.

4 голосов
/ 19 сентября 2009

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

Если речь идет об отзывчивости пользовательского интерфейса, у Rushakoff есть хороший ответ. Во время работы JavaScript никакой визуализации HTML не происходит, и пользовательский интерфейс не реагирует. Используя тайм-ауты, управление можно периодически возвращать обратно в поток рендеринга / пользовательского интерфейса, обеспечивая более отзывчивое ощущение, даже если он все еще работает только однопоточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...