A seção 5.7 introduziu as funções cue
e sync
para lidar com problemas de sincronização de threads. O que não foi explicado é que é o sistema de Time State que fornece esta funcionalidade. É de tal forma que set
is na realidade uma variação de cue
e foi construído de forma que possa trabalhar perfeitamente com o Time State - qualquer informaçãoque nós planejamos armazenar no Time State nós podemos sincronizar. Em outras palavras - nós sincronizamos sync
eventos que ainda serão inseridos no Time State.
Vamos dar uma olhada em como usar sync
para esperar por novos eventos que serão inseridos ao Time State:
in_thread do
sync :foo
sample :ambi_lunar_land
end
sleep 2
set :foo, 1
Neste exemplo nós primeiro criamos uma thread que espera um evento :foo
ser adicionado ao Time State. Após a declaração desta thread, nós esperamos por 2 batidas e então setamos (set
) :foo
para ser 1
. Isso libera a sincronização (sync
) que então segue para a próxima linha que dispara a amostra :ambi_lunar_land
.
Note que sync
sempre espera por eventos futuros e isso irá bloquear a a thread atual esperando por um novo evento. Também, irá herdar o tempo lógico da thread que chamou a sincronização através de set
ou cue
então pode também ser usado para sincronizar tempo.
No exemplo acima nós configuramos :foo
igual a 1
e não fizemos nada com isso. Nós podemos, na verdade, recuperar este valor na thread chamando sync
:
in_thread do
amp = sync :foo
sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5
Note que valores que são passados através de set
e cue
devem ser seguros - i.e. Rings imutáveis, números, símbolos ou strings congeladas. O Sonic Pi irá gerar um erro se o valor que você está tentando armazenar no Time State não for válido.