Одновременное выполнение нескольких скриптов
|
|
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. Врёте, батенька Тысяча таймеров появилась с последнего билдера. А последний какой у нас версии?
Вечная память Андрею Сергееву!
|
|
| |
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") иначе все повторяем )
|
|
| |