In Abschnitt 5.7 haben wir die Funktionen cue
und sync
vorgestellt, für die Synchronisierung von Threads. Was wir dort nicht erklärt haben ist, dass es das Time-State-System ist, das diese Funktionalität bereitstellt. Tatsächlich ist set
eine Variation von cue
und baut auf er selben Kernfunktion auf, Informationen im Time-State-System zu hinterlegen. Darüber hinaus ist sync
so gestaltet, dass es unmittelbar mit Time-State arbeitet - jegliche Information, die wir zukünftig im Time State ablegen wollen, kann auch zur Synchronisierung verwendet werden. Mit anderen Worten - wir synchronisieren auf Ereignisse, die erst noch im Time-State gespeichert werden.
Lass uns mal ansehen, wie sync
verwendet wird, um auf neue Ereignisse zu warten, die dem Time-State hinzugefügt werden:
in_thread do
sync :foo
sample :ambi_lunar_land
end
sleep 2
set :foo, 1
In diesem Beispiel erstellen wir zuerst einen Thread, der darauf wartet, dass ein Ereignis ‘:foo’ dem Time-State hinzugefügt wird. Nach dieser Thread-Deklaration schlafen wir für 2 Schläge, und dann setzen wir mit ‘set’ den Wert für ‘:foo’ auf ‘1’. Dies entfernt sync
, was dann auf die nächste Zeile übergeht, in der das ‘:ambi_lunar_land’-Sample getriggert wird.
Beachte, dass sync
immer auf zukünftige Ereignisse wartet, und dass es den gegenwärtigen Thread blockieren wird, während es auf ein neues Ereignis wartet. Zusätzlich erbt es die logische Zeit des Threads, der es via set
oder cue
getriggert hat, sodass sich hierdurch auch die Zeit von zwei Threads synchronisieren lässt.
In diesem Beispiel setzen wir ‘:foo’ auf ‘1’, darüber hinaus haben wir damit nichts angefangen. Diesen Wert können wir im Thread tatsächlich abfragen (‘get’), indem wir sync
aufrufen:
in_thread do
amp = sync :foo
sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5
Beachte, dass Werte die mit Hilfe von set
und `cue übergeben werden, thread-safe sein müssen - dies sind unveränderliche Ringe (immutable rings), Zahlen, Symbole oder eingefrorene Zeichenketten (frozen strings). Sonic Pi gibt einen Fehler aus, falls du einen Wert im Time-Store ablegen willst, der nicht gütig ist.