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;
}