Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Одновременное выполнение нескольких скриптов
userMMbДата: Четверг, 19 Июня 2008, 05:02 | Сообщение # 1
Новый участник
Группа: Пользователи
Сообщений: 1
Репутация: 0
Награды: 0
Статус: Offline
Иногда ну просто очень надо, чтобы одновременно выполнялось несколько потоков, например, команды MoveTo() и во время движения (а не перед или после) вылетал Message(), но только БЕЗ использования циклов?? Или чобы просто запускалось пару скриптов (одновременно, не один за другим) по нажатию, к примеру, на Button??
 
basmeДата: Четверг, 19 Июня 2008, 10:02 | Сообщение # 2
MMB Club
Группа: Проверенные
Сообщений: 358
Репутация: 5
Награды: 2
Статус: Offline
Элементарно. Остановимся на общем случае, когда по нажатию кнопки запускалось сразу несколько скриптов, и уже далее шли параллельно. В кнопку мы помещаем команды запуска каждого скрипта по очереди.
А сами скрипты нам нужно зациклить. К примеру, если есть скрипт Script, то в конце скрипта мы помещаем команду:
ScriptTimer("Timer1=Script","1000"), где 1000 - время, через которое скрипт повторится (ну, естественно, оно может быть любым), Script - название скрипта. В следующем скрипте команда выглядит также, но вместо Timer1 ставится Timer2*, ну и т. д. Максимальное количество - 1000.
* Только начиная с версии 4.9.7. В более ранних версиях применяется синтаксис TimerA, TimerB, TimerC.
 
Alex3AДата: Четверг, 19 Июня 2008, 10:25 | Сообщение # 3
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Вообще, это целое искуство - умение синхронизировать разные потоки, если что то не получиться с первого
раза, поработай с временем таймеров, используй команду рефреш.
Билдер весьма медленная штука, и вполне возможно получить одновременно вызов
нескольких скриптов, в результате не один не будет выполняться.
Правда, последнюю версию я не насиловал, на предмет зависаний, но судя по 1000 таймеров чансы
должны были улучшить ситуацию.
 
toizyДата: Четверг, 19 Июня 2008, 11:32 | Сообщение # 4
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Quote (basme)
И только при вызове скриптов с циклами было заметно очень небольшое притормаживание проекта

Поэтому, имхо, лучше таймеры. Циклы медленные очень...


Жизнь оказалась не такой уж и забавной, как поначалу...
 
YURIYДата: Четверг, 19 Июня 2008, 16:30 | Сообщение # 5
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
Quote (basme)
* Только начиная с версии 4.9.7. В более ранних версиях применяется синтаксис TimerA, TimerB, TimerC.

Врёте, батенька biggrin Тысяча таймеров появилась с последнего билдера. А последний какой у нас версии? smile



Вечная память Андрею Сергееву!
 
toizyДата: Четверг, 19 Июня 2008, 16:41 | Сообщение # 6
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
Верно, с версии 4.9.8 таймервы начали нумероваться. А,В,С - во всех предыдущих

Жизнь оказалась не такой уж и забавной, как поначалу...
 
Alex3AДата: Четверг, 19 Июня 2008, 17:32 | Сообщение # 7
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Quote
- Original Timers (TimerA,TimerB,TimerC) remains also in 4.9.8,
but it's recommended not to use them in new projects. TimerA=Timer1, TimerB=Timer2, TimerC=Timer3

Так что чансы не рекомендуют использовать АВС символику.

Quote (basme)
но циклы были просто незаменимой вещью, больно уж там много их было

Таймеры тоже как бы циклы, но пограмотней, и организовать аналог не проблема -
заведи переменную цикла и юзай.

 
basmeДата: Четверг, 19 Июня 2008, 18:23 | Сообщение # 8
MMB Club
Группа: Проверенные
Сообщений: 358
Репутация: 5
Награды: 2
Статус: Offline
Да всё уже съюзано, скомпилено, и даже as-master'у отправлено. Вот только нету его...
А вообще - как Вы представляете себе такую ситуацию - очень длинный скрипт, который выполняется долго и с паузами. Иногда по мере выполнения скрипта ожидается реакция пользователя, причём иногда при этом ещё и ведётся обратный отсчёт. После этого скрипт продолжается, и там ещё есть пара таких же ожиданий.
Ожидания делаются через цикл. И как в этом случае можно использовать скрипт-таймер?
 
Alex3AДата: Четверг, 19 Июня 2008, 20:08 | Сообщение # 9
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Quote (basme)
И как в этом случае можно использовать скрипт-таймер?

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

Добавлено (19 Июнь 2008, 20:08)
---------------------------------------------
Вот цикл с паузами и его аналог с таймерами,
For i=0 To 10
Pause("20")
Pause("30")
Pause("10")
Next i
----------------------------
i=0 устанавливаем счетчик цикла и запускаем скрипт scriptosnova
(скрипты указаны схематически и только с командами имеющими значение для функционирования)
scriptosnova:
(i=i+1 увеличили счетчик
ScriptTimer("scr1","20") емуляция 1 паузы
)

scr1:
(
ScriptTimer("scr2","30") второй
)

scr2:
(
ScriptTimer("scr3","10") третьей
)

scr3:
(
if i=10 then exit если счетчик цикла достиг нужного значения, весь цикл закончен
ScriptTimer("scriptosnova","1") иначе все повторяем
)

 
  • Страница 1 из 1
  • 1
Поиск: