Sincronização (Sync)

A secçã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 é uma variação de cuee foi construído de forma que possa trabalhar perfeitamente com o Time State - qualquer informação que nós planeamos armazenar no Time State nós podemos sincronizar. Em outras palavras - nós sincronizamos synceventos que ainda serão inseridos no Time State.

Aguardando por eventos

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.

Passando valores para o Futuro

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 está a tentar armazenar no Time State não for válido.