La section 5.7 a introduit les fonctions cue
et sync
lorsque nous rencontrons des problèmes de synchronisation de fils d’exécution. Ce qui n’y était pas expliqué était qu’il s’agit du système d’État du Temps qui permet cette fonctionnalité. Enfaite, la fonction set
est une variation de cue
et est construite sur la même fonctionnalité de base qui est d’insérer de l’information dans le système d’État du Temps. De plus, sync
a été créé d’une façon qui lui permet de travailler parfaitement avec l’État du Temps - toute information que nous prévoyons stocker dans l’État du Temps, nous pouvons la synchroniser.
Regardons rapidement comment utiliser sync
pour attendre que de nouveaux événements soient ajoutés à l’État du Temps :
in_thread do
sync :foo
sample :ambi_lunar_land
end
sleep 2
set :foo, 1
Dans cet exemple, nous commençons par créer un fil d’exécution qui attend pour qu’un événement :foo
soit ajouté à l’État du Temps. Après la déclaration du fil d’exécution, nous dormons pour deux rythmes et nous set
:foo
à 1
. Cela relâche ensuite le sync
qui se rend ensuite à la prochaine ligne qui est de déclencher l’exemple :ambi_lunar_land
.
Noter que sync
attend toujours pour des événements futurs et qu’il bloque le fil d’exécution actuel en attendant ce nouvel événement. Également, il va hériter du temps logique du fil d’exécution qui est déclenché par set
ou cue
, donc il peut être utilisé également pour synchroniser le temps.
Dans l’exemple ci-dessus, nous avons affecté 1
à :foo
et en avons rien fait. Nous pouvons obtenir cette valeur à partir du fil d’exécution en appelant sync
:
in_thread do
amp = sync :foo
sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5
Notez que les valeurs transférées au travers de set
et cue
doivent être protégées des fils d’exécution - c’est-à-dire des anneaux immuables, des nombres, des symboles ou des chaînes de caractères fixes. Sonic Pi lancera une erreur si la valeur que vous essayez de stocker dans l’État du Temps n’est pas valide.