[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [sc-users] SystemClock-schedAbs explodes when time arg not used?



You are telling it to do something 3 times (this is what a do loop does).

If what you want passed in is 3, use for:

3.for(3, {arg me; me.postln})

or

this.for(end, func)

so:

3.for(5, {arg me; me.postln})

start at 3, go to 5

Hope that helps.

Josh

******************************************
Joshua D. Parmenter
http://homepage.mac.com/joshpar/

"...Some people think a composer's supposed to please them, but in a way a composer is a chronicler... He's supposed to report on what he's seen and lived." -Charles Mingus

On Sep 22, 2005, at 8:37 AM, Charlls Quarra wrote:


 wow, this is definitely interesting and IMO
non-trivial to find out, thanks James. This definitely
should be a candidate for insertion in a
quirks-and-mirks-in-SC3 help file


 --- James Harkins <jamshark70@xxxxxxxxx> escribió:


On 9/22/05, Charlls Quarra
<charlls_quarra@xxxxxxxxxxxx> wrote:


3
what is going on?
0                   <---- 0? SHOULDNT IT BE 3??


Why would it be 3? 3.do will successively pass 0, 1,
2 to the i argument.

3 will never enter the loop.


Ok, everything fine (except that strange first 0
instead of 3) but now comment the line:
("current time is "++time).postln;

the sclang hangs and it get stuck dumping the

value

i=0 value. This is a month or so old CVS. Should i
update or this happens also with current cvs?


When you schedule anything on a clock, the item is
rescheduled for x
beats later, where x is the return value of the item
(the .yield value
for a routine, or the return value of a function).
That's if x is a
SimpleNumber. If it's a non-numeric class, the item
is not rescheduled
and the thread comes to an end.

When you have the

("current time is "++time).postln;

line in the function, the return value is a string,
so the function is
not rescheduled. When you remove it, the return
value is i (which will
be 0, 1 or 2).

When i == 0, a function will be rescheduled for
immediate execution,
so that thread takes over the virtual machine and
doesn't let anything
else execute. CRASH

The bottom line is, when you're scheduling a
function, if there is
even the slightest chance that the function will
return the number,
you should place some other value (such as nil) as
the last thing in
the function unless you want it to be rescheduled.
Then it's the
user's responsibility to make sure the return values
are sensible for
scheduling (e.g., not 0).

Not a bug, just a programming error (one which I've
made more times
than I care to admit).

For fun, try this:

(
~f = {|val| val.postln; };

3.do{arg i;
        SystemClock.schedAbs( thisThread.seconds +
5.0 , {arg time;
          "what is going on?".postln; ~f.value( i+1
);
//                  ("current time is
"++time).postln;
            } );
}
)

Then you'll see the threads run repeatedly.

hjh

--
James Harkins /// dewdrop world
jamshark70@xxxxxxxxxxxxxxxxx
http://www.dewdrop-world.net

"Come said the Muse,
Sing me a song no poet has yet chanted,
Sing me the universal."  -- Whitman

_______________________________________________
sc-users mailing list
sc-users@xxxxxxxxxxxxxxx
http://www.create.ucsb.edu/mailman/listinfo/sc-users










___________________________________________________________
1GB gratis, Antivirus y Antispam
Correo Yahoo!, el mejor correo web del mundo
http://correo.yahoo.com.ar

_______________________________________________
sc-users mailing list
sc-users@xxxxxxxxxxxxxxx
http://www.create.ucsb.edu/mailman/listinfo/sc-users