Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

2.4. Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?

В: Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?

Дело в том, что в цикле много операций, и пока он не выполнится, игра висит. Можно ли сделать так, чтобы цикл выполнялся, но игра продолжалась?

О:

В этом случае нужно использовать локацию-счётчик. Если игра может продолжаться даже пока цикл не выполнен, то локация-счётчик позволит распределить вычисления цикла во времени. Однако, `это вовсе не означает, что код локации-счётчика выполняется параллельно коду остальной игры`. Плеер только лишь прерывает выполнение основного кода (с определённой периодичностью) и выполняет код на локации-счётчике, затем продолжает выполнение основного кода.

Для начала нужно создать локацию-счётчик:

  • создаём локацию, название может быть любым, например "реалтайм".
  • указываем плееру, какую локацию ему нужно использовать, как локацию-счётчик. Пишем, например на самой первой локации в игре:
$counter="реалтайм"

По умолчанию обращение к локации-счётчику выполняется каждые пол секунды. Если нужно изменить период обращения, воспользуйтесь оператором `settimer`. В качестве аргумента этому оператору указывается период обращения к локации-счётчику в миллисекундах:

! обращение к локации-счётчику каждые 100 мс.
settimer 100

На локации счётчике пишем непосредственно код для циклических вычислений:

! чтобы запустить выполнение цикла,
! необходимо переменной цикл_вкл присвоить единицу
if цикл_вкл=1:
! если цикл запущен
    
! увеличиваем частоту обращения к локации-счётчику
    settimer 10
    if i<1000:
    
! если значение счётчика не достигло предела
        
! выполняем требуемые операции
        
! здесь заполняем массив
        data[i]=i
        
! увеличиваем счётчик
        i=i+1
    else
    
! если значение счётчика достигло предела
        
! останавливаем выполнение цикла
        цикл_вкл=0
        
! уменьшаем частоту обращения к локации-счётчику
        settimer 500
    end
end
! все перечисленные переменные - глобальные