Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.08.2011, 08:55
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

setTimeout/setInterval - неожиданное поведение
Всем доброго времени суток...
IE8\HTML+JS+ActiveX ; Страничка с согласия юзверя работает через объекты ActiveX c MS Excel и файловой системой, а пока она это делает, я хотел бы показывать некую анимацию, пусть банально менять текст в <textarea>...
Вычитав, что о многопоточности говорить не приходится, начал копать в сторону асинхронности, и вот я "раскуриваю" setTimeout/setInterval реф которых утверждает что они предназначены для асинхронного вызова функций, казалось бы "то что надо!", а нет... или я не уловил суть (хотя с асинхронностью знаком не по наслышке на серверном Node.js)
так вот...
пуcть в теле документа имеем некую функцию myStatusBar() , она у нас занимается некой анимацией (добавляет точку к <textarea>*.value) -
setInterval(function(){myStatusBar();},500);

далее собственно запускаем наш тяжеловесный процесс работы с Excel и файловой системой назовем его myHeavyProcess()(это или последовательный вызов нескольких функций, или вызов одной, которая сама вызывает все последующие //PS: в средем 5-6 сек.)
вот что у нас вышло
setInterval(function(){myStatusBar();},500);
myHeavyProcess();

что ожидалось: функция myStatusBar() будет выполняться каждые 0,5 сек. в то время как будет выполняться myHeavyProcess()
что вышло: функция myStatusBar() выполнится один раз, потом будет "шурупить" myHeavyProcess() все свои 5-6 сек. без какой либо анимации, и как только она закончит опять выполнится myStatusBar()...

Ну и какая-же это асинхронность ?

Последний раз редактировалось RUVATA, 17.08.2011 в 08:59.
Ответить с цитированием
  #2 (permalink)  
Старый 17.08.2011, 09:03
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от RUVATA
Ну и какая-же это асинхронность ?
А где вы написали, что myHeavyProcess у вас асинхронная? А раз она не асинхронная, то она занимает поцесс, пока выполняется. Раз она занимает процесс, все остальные ждут, пока она выполнится.
Ответить с цитированием
  #3 (permalink)  
Старый 17.08.2011, 09:08
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

Ладно, вот так...
setInterval(function(){myStatusBar();},500);
setTimeout(function(){myHeavyProcess();},1000);

на выходе то-же самое...
Ответить с цитированием
  #4 (permalink)  
Старый 17.08.2011, 09:13
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

Я уверен, что я где-то недопонимаю "евангелия" клиентского программирования...
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать?
Ответить с цитированием
  #5 (permalink)  
Старый 17.08.2011, 09:33
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

setTimeout/setInterval не создают новый процесс, код выполняется в том же процессе, но с задержкой. Соответственно, если процесс занят, то ничего другое выполниться не сможет.

Сообщение от RUVATA
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать?
Поделить сложные расчёты на куски, между которыми делать паузы.
Ответить с цитированием
  #6 (permalink)  
Старый 17.08.2011, 09:58
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от RUVATA Посмотреть сообщение
Я уверен, что я где-то недопонимаю "евангелия" клиентского программирования...
Передо мной стоит задача рисовать анимацию пока выполняются сложные расчеты и взаимодействия, подскажите что мне для этого надо сделать?
хотите настоящей асинхронности - гуглите Web Workers

или переписывайте код с шагами,как сказал Kolyaj
Ответить с цитированием
  #7 (permalink)  
Старый 17.08.2011, 10:40
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

Web Workers - заманчиво, а самое главное НАДО (я пока не столкнулся с "клиенто-шаманизмом" думал, что таки есть нечто подобное уже давно)
но к сожалению в "осле" который мне требо в связи с ActiveX, даже наметок для Web Workers нет, есть правда эмулятор
но это в общем-то костыли )
Я решил так: добавлю к прототипу функции метод вызывающий функцию ответственную за всю анимацию на страничке, ну и собственно, разбивать код на более мелкие фрагменты, между которыми "взывать" к анимации...
PS: косяк в том, что это тяжело сделать равномерно.
Ответить с цитированием
  #8 (permalink)  
Старый 17.08.2011, 11:54
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

И все равно анимации не выходит...
Даже если я линейно в программу повтыкал вызов функции которая рисует анимацию, никаких таймаутов и прочего - все линейно...
Все равно... то есть то нет... такое чувство, что она не успевает отрисовываться что-ли... ну в чем может быть дело ?
Cмысл такой: есть некий element пусть
<textarea id='satus'>Здесь хочу писать статус выполнения</textarea>

ну делаю банально
myAnimation('выполняется myFunction1')
myFunction1()
    myAnimation('выполняется myFunction2')
myFunction2()
    myAnimation('выполняется myFunction3')
myFunction3()
    myAnimation('выполняется myFunction4')
myFunction4()
    myAnimation('выполняется myFunction5')
myFunction5()
    myAnimation('выполняется myFunction6')
myFunction6()
    myAnimation('Готово')

function myAnimation(text){
var element = document.getElementById("status");	
element.value = text
};

//все myFunction*() это какие ни будь вычисления/манипуляции с объектами ActiveX

вешаем все это на button и понеслась...
все myFunction*() успешно выполняются одна за одной... а вот в 'satus' отрисовывается только 'выполняется myFunction1'... и висит, потом когда все расчеты закончились быстро мелькает 'выполняется myFunction6' и 'Готово'

В чем дело... как заставить отрисовываться в обязательном порядке ?
Ответить с цитированием
  #9 (permalink)  
Старый 17.08.2011, 12:01
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от RUVATA
myAnimation('выполняется myFunction1')
myFunction1()
myAnimation('выполняется myFunction2')
myFunction2()
myAnimation('выполняется myFunction3')
myFunction3()
myAnimation('выполняется myFunction4')
myFunction4()
myAnimation('выполняется myFunction5')
myFunction5()
myAnimation('выполняется myFunction6')
myFunction6()
myAnimation('Готово')
Вот это всё выполняется разом, без перерыва, браузеру тут некуда втиснуться, чтобы отрисовать то, что выводится.
Ответить с цитированием
  #10 (permalink)  
Старый 17.08.2011, 12:48
Аспирант
Отправить личное сообщение для RUVATA Посмотреть профиль Найти все сообщения от RUVATA
 
Регистрация: 08.02.2011
Сообщений: 41

как быть ?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поведение hover в ИЕ7 ksa (X)HTML/CSS 7 27.05.2011 04:46
Странное поведение переменной mycoding Серверные языки и технологии 4 14.01.2011 19:18
Cтранное поведение viktod Общие вопросы Javascript 23 10.04.2010 00:37
Странное поведение replace cooli0 Общие вопросы Javascript 4 25.01.2010 17:16
Отменить поведение по умолчанию bool Общие вопросы Javascript 3 06.03.2009 16:59