La sección 5.7 introdujo las funciones cue
y sync
para lidiar con el problema de sincronización de hilos. Lo que no explicó fue que es el sistema Time State es quien provee esta funcionalidad. Resulta que set
es solo una variante de cue
y está construido sobre la misma funcionalidad base la cual es insertar información en el sistema Time State. Adicionalmente, sync
tambien está diseñado de tal manera que funcione sin líos con Time State - podemos sincronizarnos conrespecto a cualquier información que planeemos almacenar en Time State. En otras palabras - Usamos sync
sobre eventos prontos a insertarse en Time State.
Echemos un vistazo rápido de como usar sync
para esperar a que nuevos eventos sean agregados a Time State:
in_thread do
sync :foo
sample :ambi_lunar_land
end
sleep 2
set :foo, 1
En este ejemplo primero creamos un hilo que espera a que un evento :foo
sea añadido al Estado de Tiempo. Después de la declaración de este hilo, dormimos durante 2 tiempos y luego set
-emos :foo
a 1
. Esto libera el sync
que pasa a la siguiente línea que es la de activar la muestra :ambi_lunar_land
.
Ten en cuenta que sync
siempre espera a eventos futuros y que va a bloquear el hilo de ejecución actual mientras espera al nuevo evento. Ademas, va a heredar el tiempo lógico del hilo que lo usó mediante set
o cue
de tal manera de que puede ser usado para sincronizar tiempo.
En el ejemplo anterior hemos puesto :foo
a 1
con el que no hemos hecho nada. En realidad podemos obtener este valor del hilo que llama a sync
:
in_thread do
amp = sync :foo
sample :ambi_lunar_land, amp: amp
end
sleep 2
set :foo, 0.5
Note that values that are passed through set
and cue
must be thread safe - i.e. immutable rings, numbers, symbols or frozen strings. Sonic Pi will throw an error if the value you are attempting to store in the Time State is not valid.