Prev | Index | Next |
The Hello, World! example demonstrated a very simple callback. This lesson demonstrates how you can pass parameters to callback functions.
1: #include "str.h" 2: #include "async.h" 3: 4: void 5: doprint(str foo) 6: { 7: warn << foo << "\n"; 8: exit(0); 9: } 10: 11: int 12: main(int argc, char *argv[]) 13: { 14: async_init(); 15: delaycb(5, 0, wrap(doprint, "Hello, World!")); 16: amain(); 17: }
This example is very similar to the "Hello, World!" example in
Lesson 1. However, in this case we have a doprint
function that can print out any string; not just "Hello, World!".
Notice the use of a str
object in
doprint
.
The delaycb
call is very similar to the previous
example, but now we pass to wrap
a function
(doprint
) and a parameter ("Hello,
World!"
) to doprint
. You can pass up to [???]
parameters to a callback function using wrap
. If you
need to pass more, you probably designed your program the wrong way,
but you could work your way around it by defining a
struct
or class
with all the necessary
parameters as member variables and passing an instance of that struct
or class.
Here's an example that passes multiple parameters to a callback:
1: #include "str.h" 2: #include "async.h" 3: 4: void 5: doprint(str foo, int bar) 6: { 7: warn << foo << " : " << bar << "\n"; 8: } 9: 10: int 11: main(int argc, char *argv[]) 12: { 13: int i; 14: 15: async_init(); 16: for(i=1; i<=3; i++) 17: delaycb(i, 0, wrap(doprint, "Hello, World!", i)); 18: delaycb(i, wrap(exit, 0)); 19: warn << "done looping\n"; 20: amain(); 21: }
First of all, notice that warn
can print out
int
-s in addition to str
objects. The
if
statement on line 9 ensures that the program exits
after printing the third "Hello, World!".
The for
-loop on line 17 calls delaycb
three times. One with a delay of 1 second, one 2 seconds, and one 3
seconds. You'll notice that the "done looping" message shows up
immediately, demonstrating that delaycb
returns
immediately and doesn't block the program, like sleep
would.
You can have multiple
pending callback when using delaycb
. In other words: later
calls to delaycb
do not disable earlier ones.
You can also use objects methods as callback functions.
1: #include "async.h" 2: 3: class foo { 4: public: 5: void fn(str s) { 6: warn << s; 7: } 8: 9: foo() { 10: delaycb(1, 0, wrap(this, &foo::fn, "constructor\n")); 11: } 12: 13: ~foo() { 14: warn << "destructor\n"; 15: } 16: }; 17: 18: 19: void 20: stop(foo *f) 21: { 22: delete f; 23: exit(0); 24: } 25: 26: int 27: main() 28: { 29: async_init(); 30: 31: foo *bar = New foo(); 32: delaycb(2, 0, wrap(bar, &foo::fn, "Hello, World!\n")); 33: delaycb(3, 0, wrap(stop, bar)); 34: amain(); 35: }
Ignore the fact that we use New
instead of
new
on line 31. We'll explain it in Lesson 4.
On line 10, foo
's constructor sets a callback to its own
fn
method. The first parameter is a pointer to the
object, the second parameter is the method within the object.
Line 32 has a similar example.
Prev | Index | Next |