Listing 2
struct network_block { string get_page(string url, int port, bool secure) { // ... fetch the page return "<html>...</html>"; } }; struct result_callback : public async_callback<string> { void accept_result(const string& s) { // show result } }; int main(int argc, char* argv[]) { thread_pool workers(5); network_block nb; result_callback rc; typedef delegate<string, mpl::vector<string, int, bool> > async_get_page; async_get_page agp(&nb, &network_block::get_page); // 1. synchronously wait async_result ar1 = agp.begin_invoke("http...", 80, false); string res1 = agp.end_invoke(ar1); // 2. wait on async result async_result ar2 = agp.begin_invoke("ftp...", 21, false); ar2.wait(); string result2 = agp.end_invoke(ar2); // 3. loop waiting for completed flag async_result ar3 = agp.begin_invoke("https...", 81, true); while(!ar3.is_completed()) thread::yield(); string result3 = agp.end_invoke(ar3); // 4. use async callback for result async_result ar4 = agp.begin_invoke("http...", 82, false, &rc); // 5. brute force launch hundreds of calls for(int i = 1000; i < 1100; ++i) agp.begin_invoke("gopher...", i, false); return 0; }