Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание паузы без доп функций и setTimeout, Пауза внутри функции. Без тормозов. 
:(
    Опции темы
funasian
Дата 27.7.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Вообщем зада такая. Нужно создать паузу (задержку), внутри функиции, но чтоб не тормозило комп. Пример.
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
<script>
    var main_flag1 = false;
    var c1 = 0;
    
    function t5(){
        
        c1 = 0;
        str1 = '<table width="100%" height="100%"><tr><td width="100%" height="100%" align="center" valign="middle">Test2'
        str1 += '</td></tr></table>';
        document.body.innerHTML = str1;
        alert('start while');
        while(main_flag1==false){
            c1 = c1 + 1;
            window.status = c1;
            //
            //Вот тут надо сделать паузу хотябы на 1 секунду.
            //При этом комп не должен тормозить
            
            //А это для того чтоб не подвесить комп.
            if(c1>1000){
                main_flag1 = true;
            }
        }
        alert('end while');
        return false;
    }
    
    </script>
</head>
<body onbeforeunload="return t5();">
Test
</body>
</html>


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


Также пытался использовать такой вариант, тоже ничего не дал.
Код

    var main_flag1 = false;
    var c1 = 0;
    var first_one = true;
    function t5(){
        if(first_one){
            c1 = 0;
            str1 = '<table width="100%" height="100%"><tr><td width="100%" height="100%" align="center" valign="middle">Test2'
        str1 += '</td></tr></table>';
        document.body.innerHTML = str1;
            first_one = false;
        }
        if(main_flag1==false){
            c1 = c1 + 1;
            window.status = c1;
            if(c1>1000){
                main_flag1 = true;
            }
            tk = window.setTimeout('t5()',1000);
        }
        alert('end while');
        return false;
    }


PM MAIL   Вверх
Sardar
Дата 29.7.2005, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Во первых тема поднималась несколько раз, последний раз участником Иль. Пользуйся поиском.

Во вторых всё таки углубимся smile В JS нельзя создавать C подобные sleep задержки. Так сложились звёзды что JS должен быть мультизадачным что бы служить базовым скриптовым языком для графического интерфейса браузера. Но по историческим причинам JS почти всегда выполняеться в одном потоке, т.е. уснув где нибудь, ты можешь получить мёртвый GUI. Поэтому setTimeout не останавливает поток, а откладывает некую функцию(в случае строки создаёться новая анонимная функция) на исполнение через некоторое время.

Что интересно если ты запустишь несколько setTimeout'ов то они все будут исполняться в текущем потоке, новых не создаёться. Другими словами если где то замереть, например alert'ом или сложными вычислениями, то следующий setTimeout может исполниться гораздо позже чем это было задуманно. Считаю что это не правильно, но так придумали нетскейповцы, а все из-за совместимости продолжают поддерживать имено такую модель.

О потоках, опытным путём было доказанно что внешние обьекты, например XMLHttpRequest исполняют своих обработчиков событий в отдельном потоке, т.е. можно получить два модальных окна(alert) одновременно, что теоретически не возможно, модальное окно останавливает исполнение потока smile
Также отдельным потоком исполняються подключаемые внешние скрипты.

Ля-ля достаточно, перейдём к практике smile
И так уснуть нельзя, можно только отложить исполнение определённой функции на время. Отсюда рассматриваем задачу под другим углом. Допустим нужно изменять обьект через каждую секунду. Напрашиваеться мысль:
Код
//на псевдо языке, создаём новый тред
new Thread() {
  while(controller.hasNextRound(this)) { //некий контроллер определяющий работать ли ещё
    object.style.color=Color.getRandomColor();
    sleep(1000); //уснуть на секунду, по сути отдаём управление другим потокам
  }
}

В JS придёться ставить код на интервал, код будет по таймеру исполняться. Это кстати очень удобно smile

Код
<div id="test" style="position: relative; width: 25%; height: 20%; font-size: 2em; font-weight: bold;">Test</div> 
<script type="text/javascript">
<!--
function thread() { //функция что будет переодичеки выполняться по таймеру
  var rnd=function(){ return Math.round(Math.random()*256); };
  var obj=document.getElementById("test");
  obj.style.color="rgb("+[rnd(),rnd(),rnd()].join(",")+")";
  //мы обязанны выйти из функции, иначе всё повиснет
}

window.setInterval(thread, 1000);
//-->
</script>


А как же в твоей задаче? Я так понял нужно подождать некоторе время а затем предложить пользователю покинуть страницу. Вот тут получим облом, т.к. при выходе из события onbeforeunload автоматом появиться окошко ИЕ о уходе. Остановить этот процесс по вполне понятным причинам нельзя(кто не понял, иначе пользователь не смог бы уйти со страницы). Установка таймаута не остановит текущий процесс. Отсюда один выход - забей smile
Я думаю вряд ли кому нужна задержка окошка ИЕ об уходе, это только раздражет.


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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
funasian
Дата 29.7.2005, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Цитата

А как же в твоей задаче? Я так понял нужно подождать некоторе время а затем предложить пользователю покинуть страницу. Вот тут получим облом, т.к. при выходе из события onbeforeunload автоматом появиться окошко ИЕ о уходе. Остановить этот процесс по вполне понятным причинам нельзя(кто не понял, иначе пользователь не смог бы уйти со страницы).


Окошко не всегда появляется. Во первых оно открывается, только тогда, когда происходит выход из фунции котороая вызвалась или же вызов другой свойе функции. А если вернуть из функции true, то страница сама закроется. А если не возврашать, и при этом в мойем первом варианте убрать
if(c1>1000){
main_flag1 = true;
}
То окно эксполрера можно будет закрыть только черзе панель задачь, да и комп будет висеть.

А так спасибо за раширенные ответы.
PM MAIL   Вверх
Sardar
Дата 29.7.2005, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(funasian @ 29.7.2005, 14:02)
Окошко не всегда появляется. Во первых оно открывается, только тогда, когда происходит выход из фунции котороая вызвалась или же вызов другой свойе функции. А если вернуть из функции true, то страница сама закроется

Окошко появляеться тогда и только тогда, когда из события onbeforeunload ты возвращаешь false(не важно какие функции вызываються), там самым ты говоришь, я ещё не готов заркыть окно. Поэтому браузер спрашиает пользователя, "мол тут скрипты ещё работают, действительны ли вы хотите покинуть страницу?". Это очень удобное напоминание если пользователь вводил кучу инфы, а потом нечаянно нажал на "крестик".

Цитата(funasian @ 29.7.2005, 14:02)
А если не возврашать, и при этом в мойем первом варианте убрать
if(c1>1000){
main_flag1 = true;
}
То окно эксполрера можно будет закрыть только черзе панель задачь, да и комп будет висеть.

Это не задержка, это подвисание бразуера, которое через 3-5 секунд будет прервано.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
funasian
Дата 1.8.2005, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



Цитата(Sardar @ 29.7.2005, 15:32)
Цитата(funasian @ 29.7.2005, 14:02)
Окошко не всегда появляется. Во первых оно открывается, только тогда, когда происходит выход из фунции котороая вызвалась или же вызов другой свойе функции. А если вернуть из функции true, то страница сама закроется

Окошко появляеться тогда и только тогда, когда из события onbeforeunload ты возвращаешь false(не важно какие функции вызываються), там самым ты говоришь, я ещё не готов заркыть окно. Поэтому браузер спрашиает пользователя, "мол тут скрипты ещё работают, действительны ли вы хотите покинуть страницу?". Это очень удобное напоминание если пользователь вводил кучу инфы, а потом нечаянно нажал на "крестик".

Цитата(funasian @ 29.7.2005, 14:02)
А если не возврашать, и при этом в мойем первом варианте убрать
if(c1>1000){
main_flag1 = true;
}
То окно эксполрера можно будет закрыть только черзе панель задачь, да и комп будет висеть.

Это не задержка, это подвисание бразуера, которое через 3-5 секунд будет прервано.

Если вернуть текст то оно его выведет в предупреждении закрывать или нет. И этот текст рассматривается как false. По крайней мере так в IE

Второе. У меня висит повисшее покаместь я его сам не убью.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.