sclang: ServerShmInterface - try to avoid multiple destructor calls
[supercollider.git] / HelpSource / Classes / SkipJack.schelp
blob30e8540314942bc6ef97435d19c5a2a345fc4a93
1 class:: SkipJack
2 summary:: A utility for background tasks that survive cmd-period
3 categories:: Scheduling, Libraries>JITLib>GUI
4 related:: Classes/CmdPeriod
6 Description::
7 SkipJack is a utility to run a function in the background repeatedly, that survive cmd-period.
9 A typical use is with a window displaying the state of some objects every now and then. (This is better in some cases than
10 updating the GUI at every change. If the changes happen fast, you don't choke your CPU on gui updating.)
12 But SkipJack is useful whenever you need a periodic function to run in the background and not go away if the user hits cmd-period.
14 ClassMethods::
16 private::initClass
18 method::new
20 argument::updateFunc
21 A link::Classes/Function:: to repeat in the background.
23 argument::dt
24 The time interval at which to repeat. It can also be a stream or a function that returns a number.
26 argument::stopTest
27 A test whether to stop the task now. Usually a Function.
29 argument::name
30 A name for this skipjack. Used for posting information and in the link::#*stop:: classmethod.
32 argument::clock
33 The clock that plays the task. Default is link::Classes/AppClock::, so SkipJack can call GUI primitives. If you need more precise timing, you can supply your own clock, and use defer only where necessary.
35 argument::autostart
36 When true (default) SkipJack starts automatically as it is created.
38 method:: stop
39 Stop a skipjack by name.
41 method:: stopAll
42 Stop all skipjacks.
44 method:: defaultClock
45 The default clock (AppClock)
47 method:: verbose
48 When true, SkipJack posts messages when it starts, stops or restarts.
50 method:: all
51 The global set of all skipjacks.
53 Instancemethods::
54 private:: cmdPeriod
56 method:: dt
57 Get or set the time interval.
59 method:: task
60 The internal Routine that wraps updateFunc.
62 method:: name
63 The name of this skipjack.
65 method:: stopTest
66 The current stopTest. (see argument in link::#*new:: )
68 method:: start
69 Start this skipjack.
71 method:: play
72 Same as code::start::
74 method:: stop
75 Stop this skipjack.
77 method:: clock
78 Get or set the clock used. This will only be updated when the skipjack restarts.
80 method:: updateFunc
81 The updateFunc set by the argument to link::#*new::
83 Examples::
84 Simple example:
85 code::
86 w = SkipJack({ "watch...".postln; }, 0.5, name: "test");
87 SkipJack.verbose = true;    // post stop/wakeup logs
89 w.stop;
90 w.start;
92 //      now try to stop with cmd-. : SkipJack always restarts itself.
93 thisProcess.stop;
95 w.stop;
98 Using stopTest:
99 code::
100 a = 5;
101 w = SkipJack({ "watch...".postln; }, 0.5, { a == 10 }, "test");
102 a = 10; // fulfil stopTest
105 Typical use: SkipJack updates a window displaying the state of some objects every now and then.
106 code::
108 d = (a: 12, b: 24);
109 d.win = Window("dict", Rect(0,0,200,60)).front;
110 d.views = [\a, \b].collect { |name, i|
111     StaticText(d.win, Rect(i * 100,0,96,20))
112         .background_(Color.yellow).align_(0).string_(name);
114 w = SkipJack({
115         "...".postln;
116         [\a, \b].do { |name, i|
117             d.views[i].string_(name ++ ":" + d[name])
118         }
119     },
120     0.5,
121     { d.win.isClosed },
122     "showdict"
126 d.a = 123;      // updates should be displayed
127 d.b = \otto;
128 d.win.close;    // when window closes, SkipJack stops.
131 If you need to get rid of an unreachable skipjack:
132 code::
133 SkipJack({ "unreachable, unkillable...".postln }, name: "jack");
135 SkipJack.stopAll        // do this to stop all;
137 SkipJack.stop("jack");  // reach it by name and stop