Difference between revisions of "ChucK/Patterns/ExternalDataLoader"
From CSWiki
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | I have been experimenting with a pattern for loading external data, such that once the data is loaded into the ChucK VM, an event is triggered and a consumer of the data is informed that the data is ready for loadinginng | + | I have been experimenting with a pattern for loading external data, such that once the data is loaded into the ChucK VM, an event is triggered and a consumer of the data is informed that the data is ready for loadinginng. The code below is just scratch code that I am in the process of cleaning up. When this page is complete, I will have 4 distinct modules: a DataLoadedEvent class, a data producer, a data consumer, a class to hold globally accessible static fields like the DataLoadedEvent, and a class to hold externally loaded data (class will provide nice methods to iterate over the data loaded (without having to know the specifics of the data collection) |
+ | <pre> | ||
+ | public class DataObj { | ||
+ | int mydata[]; | ||
+ | } | ||
+ | </pre> | ||
+ | <pre> | ||
+ | public class TheEvent extends Event | ||
+ | { | ||
+ | int value; | ||
+ | } | ||
+ | </pre> | ||
+ | <pre> | ||
+ | //GlobalSpace - All public class that holds globally accessible | ||
+ | // Objects (in this case a user defined event class | ||
+ | //However you cannot (in v. 1.2.1.1) use a straightforward | ||
+ | //approach to capturing non-primative types in a static variable | ||
+ | //So we do a bare declare of e... | ||
+ | |||
+ | public class GlobalSpace { | ||
+ | static TheEvent @ e; | ||
+ | //static int data[200]; | ||
+ | static DataObj @ callback; | ||
+ | |||
+ | } | ||
+ | // ...then use the following to do the assignment | ||
+ | |||
+ | new TheEvent @=> GlobalSpace.e; | ||
+ | //This seems to be a necessary hack to allow us to | ||
+ | //use a non-primitive in a static variable space | ||
+ | // | ||
+ | </pre> | ||
+ | <pre> | ||
+ | // Event class is defined in the_event.ck | ||
+ | // and the reference to the event class is held in the GlobalSpace | ||
+ | // as a static variable | ||
+ | int data_ready; | ||
+ | int count; | ||
+ | DataObj @ dataObj; | ||
+ | // handler | ||
+ | fun int hi( TheEvent e ) | ||
+ | { | ||
+ | while( true ) | ||
+ | { | ||
+ | // wait on event | ||
+ | e => now; | ||
+ | // get the data | ||
+ | <<<"Data Is Ready">>>; | ||
+ | 1 => data_ready; | ||
+ | 0 => count; | ||
+ | GlobalSpace.callback @=> dataObj; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // spork | ||
+ | <<<"Event Receiver">>>; | ||
+ | spork ~ hi( GlobalSpace.e ); | ||
+ | spork ~ hi( GlobalSpace.e ); | ||
+ | spork ~ hi( GlobalSpace.e ); | ||
+ | spork ~ hi( GlobalSpace.e ); | ||
+ | |||
+ | // infinite time loop | ||
+ | /**************/ | ||
+ | while( true ) | ||
+ | { | ||
+ | // advance time | ||
+ | 1::second => now; | ||
+ | if (data_ready) { | ||
+ | if (count < dataObj.mydata.cap()) { | ||
+ | <<< dataObj.mydata[count]>>>; | ||
+ | 1 +=> count; | ||
+ | } else { | ||
+ | 0 => data_ready => count; | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | /* */ | ||
+ | </pre> | ||
+ | <pre> | ||
+ | // the event | ||
+ | TheEvent @ e; | ||
+ | GlobalSpace.e @=> e; | ||
+ | |||
+ | |||
+ | <<<"Flag data is ready">>>; | ||
+ | DataObj dataObj; | ||
+ | [1,2,3,5,7,11,13] @=> dataObj.mydata; | ||
+ | dataObj @=> GlobalSpace.callback; | ||
+ | e.signal(); | ||
+ | </pre> | ||
Michael Nardell | Michael Nardell |
Latest revision as of 14:50, 3 December 2007
I have been experimenting with a pattern for loading external data, such that once the data is loaded into the ChucK VM, an event is triggered and a consumer of the data is informed that the data is ready for loadinginng. The code below is just scratch code that I am in the process of cleaning up. When this page is complete, I will have 4 distinct modules: a DataLoadedEvent class, a data producer, a data consumer, a class to hold globally accessible static fields like the DataLoadedEvent, and a class to hold externally loaded data (class will provide nice methods to iterate over the data loaded (without having to know the specifics of the data collection)
public class DataObj { int mydata[]; }
public class TheEvent extends Event { int value; }
//GlobalSpace - All public class that holds globally accessible // Objects (in this case a user defined event class //However you cannot (in v. 1.2.1.1) use a straightforward //approach to capturing non-primative types in a static variable //So we do a bare declare of e... public class GlobalSpace { static TheEvent @ e; //static int data[200]; static DataObj @ callback; } // ...then use the following to do the assignment new TheEvent @=> GlobalSpace.e; //This seems to be a necessary hack to allow us to //use a non-primitive in a static variable space //
// Event class is defined in the_event.ck // and the reference to the event class is held in the GlobalSpace // as a static variable int data_ready; int count; DataObj @ dataObj; // handler fun int hi( TheEvent e ) { while( true ) { // wait on event e => now; // get the data <<<"Data Is Ready">>>; 1 => data_ready; 0 => count; GlobalSpace.callback @=> dataObj; } } // spork <<<"Event Receiver">>>; spork ~ hi( GlobalSpace.e ); spork ~ hi( GlobalSpace.e ); spork ~ hi( GlobalSpace.e ); spork ~ hi( GlobalSpace.e ); // infinite time loop /**************/ while( true ) { // advance time 1::second => now; if (data_ready) { if (count < dataObj.mydata.cap()) { <<< dataObj.mydata[count]>>>; 1 +=> count; } else { 0 => data_ready => count; } } } /* */
// the event TheEvent @ e; GlobalSpace.e @=> e; <<<"Flag data is ready">>>; DataObj dataObj; [1,2,3,5,7,11,13] @=> dataObj.mydata; dataObj @=> GlobalSpace.callback; e.signal();
Michael Nardell