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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Постоянно работающая функция, Помогите разобраться 
:(
    Опции темы
GIK
Дата 5.10.2005, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Привет всем.
Я ранее задавал этот вопрос, но чесно говоря не все понял.
Вот мой скрипт:
Код

<html>
   <head>
     <title>Основное оглавление</title>
     <script language="javascript">
    
        function post1()
       { a=Number(document.form1.num1.value); 
         b=Number(document.form1.num2.value);
        
         gik(a,b);
        }
         function gik(a)
    { a+=a;
       document.form1.num1.value=a;
       window.setInterval(gik(),1000);
    }
     </script>
   </head>  
 <body bgcolor=silver>
  <form name="form1" id="f">
   <input type="text" size=7 name="num1"><br>
   <input type="text" size=7 name="num2"><br>
   <input type="text" size=7 name="itog"><br>
   <input type="button" size=5 value="Вычислить" onClick="post1()"><br>
  </form>
 </body>
</html> 


А это скрипт Sarbara
Код

<script type="text/javascript">
<!--

function start_reken(form) 
{
  var bt=form.elements.strt;
  if(bt.proc) {                   
    window.clearInterval(bt.proc);    
    bt.value="Запустить вычисление"; 
    bt.title="Нажмите что бы запустить процесс вычисления";
    bt.proc=null;} 
else {
    bt.value="Вычисление запущенно";
    form.elements.strt.title="Вы можете продолжать работу, процесс автоматически примет новые значения";
    bt.proc=window.setInterval(function()
    {
      step=1;
      reken(form, parseInt(form.elements.num1.value));
    }, 500);   window.setInterval)
  } 
}
function reken(f, original) {
  var a, b;
  if(isNaN(a=parseFloat(f.elements.num1.value))||isNaN(b=parseFloat(f.elements.num2.value))) {
    alert("Один из аргументов не число!");
    f.elements.strt.click(); //хмм, не красиво... вызываем клик на кнопке, что бы сработала start_reken...
    return;
  }
  if(step<0) {
    f.elements.num1.value=(a-b);
    if((a-b)<=original) {
      alert("Вернулись к оригинальному значению: "+original);
      f.elements.strt.click();
    }
  } else {
    f.elements.num1.value=(a+b);
    if(Math.round(Number.MAX_VALUE-(a+b))<2) {
      alert("Дошли до максимума: "+Number.MAX_VALUE);
      f.elements.num1.value=Number.MAX_VALUE;
      step=-1;
    }
  }
}
//-->
</script>

<form id="frm">
Введите число не меньше 100: <input type="text" name="num1" value="введите число" onfocus="this.value='';"><br>
<input type="text" name="num2" value="число+2">
<input type="button" name="strt" value="Запустить вычисление" title="Нажмите что бы запустить процесс вычисления" onClick="start_reken(this.form)"><br>
</form>

Подскажите кто нибуть что здесь есть что?

Это сообщение отредактировал(а) Aliance - 5.10.2005, 21:03


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
GIK
Дата 5.10.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Попыталься еще так (сдесь куча ошибок, но логика должна быть ясна)
Код

 function start()
      { a=document.getElementById("f").elements[0].value; // Объявлем глобальные переменные
        b=document.getElementById("f").elements[1].value;
        max=document.getElementById("f").elements[2].value; //Фиксируем максимум
        min=a; // Фиксируем минимум
        post1();
       }

          function post1()
     { 
       a+=b; // Увеличиваем  число
    if (a<max) {document.getElementById("f").elements[0].value=a; // Проверяем
                 window.setInterval(function post1(), 500);
                }
          
             
       else {break ;  // Остановка текущей функции 
               post2();}  // Вызов второй функции и остановка первой функции

      }


           function post2() // Вызывается если достиг max или больше max
      { a-=b;  
        if(a>min) 
          { documentgetElementById("f").element[0].value=a;
            window.setInterval(function post2(), 500);     
          }    
         else {break; 
         post1() ;} 
}



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 5.10.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



GIK, когда пишешь, ты код запускашь? Ну ладно ошибки логики, но ошибки синтаксиса ведь сразу выдаються интерпретатором.

И где вопрос или ты хочешь, что бы тебе помогли превратить "это" в нечто работающее?


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


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



GIK
Ну нет слов... Когда ты научишься пользоваться форумной подсветкой!
Последующие посты с неправильным использованием кнопки код буду скрывать!

Цитата(GIK @ 5.10.2005, 15:36)
А это скрипт Sarbara

И ты бы хоть ник писал правильно... smile

Это сообщение отредактировал(а) Aliance - 5.10.2005, 21:04
PM MAIL WWW ICQ Skype   Вверх
GIK
Дата 6.10.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Я бы хотел разобратся разобратся в этом скрипте:
Код

<script type="text/javascript">
<!--

function start_reken(form) 
{
  var bt=form.elements.strt;
  if(bt.proc) {                   
    window.clearInterval(bt.proc);    
    bt.value="Запустить вычисление"; 
    bt.title="Нажмите что бы запустить процесс вычисления";
    bt.proc=null;} 
else {
    bt.value="Вычисление запущенно";
    form.elements.strt.title="Вы можете продолжать работу, процесс автоматически примет новые значения";
    bt.proc=window.setInterval(function()
    {
      step=1;
      reken(form, parseInt(form.elements.num1.value));
    }, 500);   window.setInterval)
  } 
}
function reken(f, original) {
  var a, b;
  if(isNaN(a=parseFloat(f.elements.num1.value))||isNaN(b=parseFloat(f.elements.num2.value))) {
    alert("Один из аргументов не число!");
    f.elements.strt.click(); //хмм, не красиво... вызываем клик на кнопке, что бы сработала start_reken...
    return;
  }
  if(step<0) {
    f.elements.num1.value=(a-b);
    if((a-b)<=original) {
      alert("Вернулись к оригинальному значению: "+original);
      f.elements.strt.click();
    }
  } else {
    f.elements.num1.value=(a+b);
    if(Math.round(Number.MAX_VALUE-(a+b))<2) {
      alert("Дошли до максимума: "+Number.MAX_VALUE);
      f.elements.num1.value=Number.MAX_VALUE;
      step=-1;
    }
  }
}
//-->
</script>

<form id="frm">
Введите число не меньше 100: <input type="text" name="num1" value="введите число" onfocus="this.value='';"><br>
<input type="text" name="num2" value="число+2">
<input type="button" name="strt" value="Запустить вычисление" title="Нажмите что бы запустить процесс вычисления" onClick="start_reken(this.form)"><br>
</form>


Мне не понятны некоторые детали этого кода,
я был бы благодарен если бы мне по порядку разъяснили что сдесь есть что.
а мой скрипт пожалуй не надо переделывать (нехочу занимать вашего времени на ерунду), сам разберусь если разъясните скрипт который привел Sardar
P.S.
Извиняюсь за неправильный ник.



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Aliance
Дата 6.10.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Это новый вопрос? Новый!
Тогда и постите его в новых топик, согласно правилам форума.
Задавайте вопрос четче, как это все пояснить...
Пишите что не понятно - поясним, а вообще - читай мануалы, сам себе пояснишь 90% кода, а уж потом только беги на форум smile
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 6.10.2005, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



GIK что конкретно не ясно. Ответ "всё" меня не устраивает, тогда отправлю читать мануал по JS.

Кратко, нужен цикл, который постоянно бы чего нибуь делал. Это возможно двумя путями:
  • запустить паралельный процесс
  • запустить таймер, по прерыванию которого будем чего нибудь вычислять.


JS существовал ещё во времена Win3.1 без многозадачности, поэтому он от природы не многозадачен. Почему разработчики сегодняшних интерпретаторов не сделают треды, не пойму, ведь язык не накладывает ограничений, а только способствует этому.

Второй (третий, N'ый) процесс можно запустить с помощью хака smile Например поставить обьект XmlHttpReuqest, в onreadystatechange которого положить нужный код. Событие встроенного XmlHttpRequest будет отработанно в отдельном треде, это точно известно для ИЕ.

Второй способ на таймерах это естественное решение от нетскейповцев - "кооперативная многозадачность". Кооперативная, в смысле "другой тред" не будет исполняться, пока текущий не отдаст ему управление. В JS это поставка функции на setInterval, что запустит таймер, который с заданной частотой будет вызывать функцию.

Внимание: все запущенные таймеры работают в одной задаче, это значит если какая то функция чем то очень плотно занята, остальные таймеры не работают и даже не считают время smile

И так в моём примере мы ставим функцию на таймер, она при каждом вызове быстро отрабатывает , затем выход из функции, тогда следующий таймер может продолжить работу. Немного криво? Я бы тоже так сказал, но увы пока кто нибудь с ясным умом не спроектирует стандартную библиотеку, куда войдут такие необходимые обьекты как Dictionary, Thread и прочее, так и будем париться. ECMAScript усугубил ситуацию, поставив в стандарт огрехи нетскейповцев, например кривое поведение split функции или убогий интерфейс Array.


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


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Sardar у тебя сдесь вызов функции
Код

bt.proc=window.setInterval(function()
    {step=1;
      reken(form, parseInt(form.elements.num1.value));
    }, 9000); 

, которая в свою очередь вызывает другую функцию (reken), где происходит проверка на числа, и в которой при каждом повторении переменной "a" сначало присваивается первоночальное значение, а далле присваивается значение (a+b) (при случае что все поля - числа). но мне кажется что есть сдесь глюк связанный с переменной step.
Расуждаю: Если переменная step получает изначально =1, а если он равен -1 (step<0), то происходит вычет, только как он произойдет если при достимжении максимума который мне совсем непонятен какой, произойдет вызов функции

Код

setInterval(function()
    {step=1;

step опять таки примет значение =1

Я хотел бы вместе с тобо (если можно на ты и если можно вообще) разобраться в приведенном мною сценарии.
Сдесь я установил максимум и минимум, создал второй интервал при котором уменьшается значение. Единственно не знаю как реализовать прекращение вычетов (может остановкой, или поставить под условие когда переменная дойдет до минимума)

Код

<script type="text/javascript">
<!--

  function start_reken(form) 
{  var max = 1200;
   var min = form.elements.num1.value; 
   window.setInterval(function()
    {
      reken(form, parseInt(max), parseInt(min));
    }, 500); 


 function reken(f, max, min) {
  var a, b; 
  if(isNaN(a=parseFloat(f.elements.num1.value))||isNaN(b=parseFloat(f.elements.num2.value))) 
   {
    alert("Один из аргументов не число!");
    f.elements.strt.click(); //хмм, не красиво... вызываем клик на кнопке, что бы сработала start_reken...
    return;
    }   
   else {
    plus=f.elements.num1.value=(a+b);
    if(plus>=max) {
      alert("Дошли до максимума: "+max); // И вызываем другой пока не дойдет до минимума
     window.setInterval (function()
    { minus=f.elements.num1=plus-b;    
      if (minus<=min)  
     {break // и продолжаем дальше }

    }, 7000 //для разнообразия время вычетов сделал меньше(возможно это пригодится для каких нибуть расчетов в еще более сложных программах)
    )
                  }
         } 
                              }
                        
//-->
</script>

<form id="frm">
Введите число не меньше 100: <input type="text" name="num1" value="введите число" onfocus="this.value='';"><br>
<input type="text" name="num2" value="число+2">
<input type="button" name="strt" value="Запустить вычисление" title="Нажмите что бы запустить процесс вычисления" onClick="start_reken(this.form)"><br>
</form>


Это сообщение отредактировал(а) Aliance - 7.10.2005, 14:34


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 8.10.2005, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Правильно нашёл баг smile
step должно быть инициализированно 1 вне определения функции для setInterval, иначе будет зависание как только дойдём до максимума.

В остальном... если честно, надоедает вычищать твой код. Я буду помогать если ты научишся писать JS код, а не мешанину выдающую кучу синтаксических ошибок. Просто запускай в браузере перед тем как сюда запостить. Ошибки логики исправим, ошибки синтаксиса - это уже неуважение к участникам форума.


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


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Цитата
Ошибки логики исправим, ошибки синтаксиса - это уже неуважение к участникам форума.
Понял, больше постараюсь нетупить smile


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Aliance
Дата 8.10.2005, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Цитата(GIK @ 7.10.2005, 15:27)
Сдесь я установил

Да и не только синтаксиса...
PM MAIL WWW ICQ Skype   Вверх
GIK
Дата 9.10.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Sardar все, решил я свою проблему,
все оказалось просто smile

Зацени
Код

<html>
<head>
<script type="text/javascript">
<!--

  function plus() 
{  var a = Number(document.form1.num1.value);
   var b = Number(document.form1.num2.value);
   var max = Number(document.form1.max.value);
   document.form1.num1.value=(a+b);
   var m = document.form1.num1.value;  
   if (m<max)
    {setTimeout("plus()",700);
      
    }
    else 
    {minus(); 
     }
}
   function minus()
{ var a = Number(document.form1.num1.value); // "а" получает значение "max" или больше 
  var b = Number(document.form1.num2.value); 
  var min = Number(document.form1.min.value); 
  document.form1.num1.value=(a-b);
   var m2 = Number(document.form1.num1.value); // уменьшенное значение 
  if (m2>min)
   { setTimeout("minus()",700);
     }
  else {plus();} 
}                         
//-->
</script>
</head>
<body>
<form name="form1">
Введите число:<input type="text" name="num1" value="введите число" onfocus="this.value='';"><br>
Введите число-увеличитель:<input type="text" name="num2" size="7"><br>
Введите предел:<input type="text" name="max" size="7"><br>
Введите минимум:<input type="text" name="min" size="7"><br>
<input type="button" name="strt" value="Запустить вычисление" title="Нажмите что бы запустить процесс вычисления" onClick="plus()"><br>
</form>
</body>
</html> 



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 9.10.2005, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Есть один маленький недочёт, жми несколько раз на кнопку, попробуй сам обьяснить это smile


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


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Функция вызывается еще раз, тем самым увеличивается скорость вычисления. Это конечно не входило в мои планы, но мне это и немешает, хотя можно было добавить к сценарию остановку вычисления. А так этот скрипт я обдумал накануне вечером, а написал с первого раза за минут 5-7.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 9.10.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата(GIK @ 9.10.2005, 11:39)
Функция вызывается еще раз, тем самым увеличивается скорость вычисления

Поведение как буд-то с каждым нажатием новый тред запускаеться, по логике так оно в терминах JS и происходит) Но если тебе не мешает...


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


 




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


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

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