Sync

Sekcja 5.7 wprowadziła funkcje cue i sync, mieliśmy wtedy do czynienia z problemem synchronizacji wątków. To co nie zostało wytłumaczone to fakt, że funkcjonalność ta jest zapewniona przez system Stanu Czasu (Time State). Tak się właśnie dzieje gdyż funkcja set jest w zasadzie wariacją funkcji cue i jest zbudowana na bazie tej samej podstawowej funkcjonalności, która pozwala na umieszczenie informacji w systemie Stanu Czasu. Ponadto, sync jest również zaprojektowany w taki sposób, że działa bezproblemowo z Stanem Czasu - do każdej informacji, którą chcielibyśmy umieścić w Stanie Czasu, możemy się zsynchronizować. Innymi słowy - synchronizujemy się (sync) na zdarzeniach, które będą umieszczone w Stanie Czasu.

Czekając na Zdarzenia

Spróbujmy spojrzeć szybko jak należy używać polecenia sync aby móc poczekać aby nowe zdarzenia zostały dodane do Stanu Czasu (Time State):

in_thread do
  sync :foo
  sample :ambi_lunar_land
end
sleep 2
set :foo, 1

W tym przykładzie najpierw tworzymy wątek, który czeka na zdarzenie :foo aby można go było dodać do Stanu Czasu. Po zadeklarowaniu tego wątku śpimy przez 2 uderzenia i następnie ustawiamy (set) :foo na wartość 1. To z kolei zwalnia sync co pozwala na przeniesienie się do kolejnej linii, w której zostaje wywołany sampel :ambi_lunar_land.

Zauważ, że funkcja sync zawsze czeka na przyszłe zdarzenia, i że zablokuje on aktualny wątek w oczekiwaniu na kolejne zdarzenie. Ponadto, odziedziczy ona czas logiczny wątku, który wywołał ją poprzez funkcję set lub cue, więc może też być używana do synchronizowania czasu.

Przekazywanie wartości w Przyszłość

W przykładzie powyżej nadajemy :foo wartość 1 i nic z nią nie robimy. Możemy właściwie pobrać tę wartość wewnątrz wątku korzystając z sync:

in_thread do
  amp = sync :foo
  sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5

Zauważ, że wartości które są przekazywane do funkcji set i cue muszą być bezpieczne dla wątków - np. niezmienne pierścienie (rings) liczby, symbole lub zamrożone łańcuch znaków (strings). Sonic Pi rzuci błąd jeśli wartość którą próbujesz umieścić w Stanie Czasu (Time State) jest niepoprawna.