[chuck-users] implementing a "wait for signal with timeout"

Hans Aberg haberg at math.su.se
Mon Jun 8 15:24:29 EDT 2009


On 8 Jun 2009, at 19:53, Robert Poor wrote:

> In real-time music making, sometimes you want to wait for a signal  
> (e.g. event.broadcast()) OR for a specific time to elapse, whichever  
> comes first.  I've implemented ways to do this, but I'm not really  
> satisfied with the code.
>
> Here's the problem: Lets say that your music is slaved to a  
> metronome, and the metronome is allowed to change speed.  You want  
> your music to stay sync'd to the metronome.  If you simply do:
> 	now + (1/tempo)::second => time next_beat;
> 	next_beat => now;
> 	play_note();
> you'll be in trouble if the metronome speeds up while you're  
> waiting: your note will be late.  The fundamental problem is that  
> once you execute "next_beat => now;", you're committed to waiting  
> and there's now way to break out of it, short of killing the  
> thread.  The problem with killing the thread is that you leak 88K  
> with each thread (!!!).
>
> So here's the programming challenge: how would you implement a "wait  
> for signal with timeout" that will block until it gets a signal OR a  
> specified time has elapsed?  Since each thread costs 88K in non- 
> reclaimed memory, you may create threads, but your solution must re- 
> use them.

You might check out the noteoff() function I implemented here:
   https://lists.cs.princeton.edu/pipermail/chuck-users/2009-May/004183.html

There is a similar problem of future event rescheduling: a future  
disconnect, that should be canceled, if there has been a new note-on.  
So the future event gets a thread of its own, and when it awakens, it  
checks if there has been a rescheduling - if so, it just cancels the  
event.

As 'chuck' does not have event scheduling and kill-threads was not  
intended for massive use, this seems to be the only way. But it works  
just fine.

   Hans




More information about the chuck-users mailing list