Forgot a help fix: Drag a dock's title bar, not divider, to reposition
[supercollider.git] / HelpSource / Classes / Condition.schelp
blob2f6755d4feb4761b66f1853832aacbdbbcc7b2e8
1 CLASS::Condition
2 categories::Scheduling
3 summary::Block the execution of a thread
5 CLASSMETHODS::
7 method::new
8 Create a new instance, set the strong::test:: variable.
10 INSTANCEMETHODS::
12 method::test
13 Answer whether the condition will block or not (boolean).
15 method::wait
16 Wait until the condition is true and signalled. This only works in a Routine. This method yields a symbol (\hang), so that the clock doesn't reschedule the Routine.
17 code::
18 c = Condition(false); fork { 0.5.wait; "started ...".postln; c.wait;  "... and finished.".postln };
19 c.test = true;
20 c.signal;
23 method::hang
24 Wait for strong::value:: time, regardless of test. This only works in a Routine. This method yields a symbol (\hang), so that the clock doesn't reschedule the Routine.
25 code::
26 c = Condition.new; fork { 0.5.wait; "started ...".postln; c.hang;  "... and finished.".postln };
27 c.unhang;
30 method::signal
31 If link::#-test:: is true, reschedule blocked threads.
33 method::unhang
34 Resume threads.
36 EXAMPLES::
38 code::
40 c = Condition.new(false);
42 Routine {
43         1.wait;
44         "waited for 1 second".postln;
45         1.wait;
46         "waited for another second, now waiting for you ... ".postln;
47         c.wait;
48         "the condition has stopped waiting.".postln;
49         1.wait;
50         "waited for another second".postln;
51         "waiting for you ... ".postln;
52                 c.test = false;
53                 c.wait;
54         "the condition has stopped waiting.".postln;
55         1.wait;
56         "the end".postln;
57 }.play;
60 // continue
62 c.test = true;
63 c.signal;
66 // a typical use is a routine that can pause under certin conditions:
68 c = Condition.new;
69 fork { loop { 1.wait; "going".postln; c.wait } };
71 c.test = true; c.signal;
72 c.test = false;
75 code::
76 // the same, using hang
79 c = Condition.new;
81 Routine {
82         1.wait;
83         "waited for 1 second".postln;
84         1.wait;
85         "waited for another second, now waiting for you ... ".postln;
86         c.hang;
87         "the condition has stopped waiting.".postln;
88         1.wait;
89         "waited for another second".postln;
90         "waiting for you ... ".postln;
91         c.hang;
92         "the condition has stopped waiting.".postln;
93 }.play;
96 // continue
97 c.unhang;
100 Waiting for Synths to end (waitForFree) uses a Condition implicitly:
101 code::
103 SynthDef(\help, {
104         var mod = LFNoise2.kr(ExpRand(0.5, 2)) * 0.5;
105         var snd =  mod * Blip.ar(Rand(200, 800) * (mod + 1));
106         Out.ar(0, snd);
107         FreeSelf.kr(mod < 0); // free the synth when amplitude goes below 0.
108 }).add;
112 fork {
113         10.do {
114                 "started a synth".postln;
115                 Synth(\help).waitForFree;
116                 "This one ended. Wait a second,  I will start the next one.".postln;
117                 1.wait;
118         };
119         "This is it.".postln;