rendered paste body#include "Fetchwebpages.h"extern "C"{ #include "pthread.h"}using namespace std;Fetchwebpages::Fetchwebpages(){}Fetchwebpages::~Fetchwebpages(){}int main( int argc, const char* argv[] ){ Fetchwebpages fwp; fwp.addpages(); fwp.getsources();}// Add some urls to our vectorvoid Fetchwebpages::addpages(){ pageinfo pi; pi.url = "http://www.slashdot.org/"; pages.push_back(pi); pi.url = "http://www.gardenaction.co.uk/fruit_veg_diary/fruit_veg_mini_project_september_2_apple_monarch.htm"; pages.push_back(pi); pi.url = "http://www.arkansasapplefestival.org/"; pages.push_back(pi); pi.url = "http://crave.cnet.co.uk/digitalmusic/0,39029432,49276362,00.htm"; pages.push_back(pi); pi.url = "http://www.vintage-computer.com/apple_ii.shtml"; pages.push_back(pi); pi.url = "http://school.discovery.com/clipart/clip/apple_lineart_color.html"; pages.push_back(pi); pi.url = "http://gizmodo.com/gadgets/laptops-pcs/apple/apple-iproduct-a-rebuttal-029508.php"; pages.push_back(pi); pi.url = "http://yodelt.wordpress.net/2005/05/"; pages.push_back(pi); pi.url = "http://www.slashdot.org/"; pages.push_back(pi); pi.url = "http://www.gardenaction.co.uk/fruit_veg_diary/fruit_veg_mini_project_september_2_apple_monarch.htm"; pages.push_back(pi); pi.url = "http://www.arkansasapplefestival.org/"; pages.push_back(pi); pi.url = "http://crave.cnet.co.uk/digitalmusic/0,39029432,49276362,00.htm"; pages.push_back(pi); pi.url = "http://www.vintage-computer.com/apple_ii.shtml"; pages.push_back(pi); pi.url = "http://school.discovery.com/clipart/clip/apple_lineart_color.html"; pages.push_back(pi); pi.url = "http://gizmodo.com/gadgets/laptops-pcs/apple/apple-iproduct-a-rebuttal-029508.php"; pages.push_back(pi); pi.url = "http://yodelt.wordpress.net/2005/05/"; pages.push_back(pi);}// Fetch url page sourcevoid *Fetchwebpages::fetchpage(void* url){ //cout << "In fetch page" << endl; Retrievepage page; string urls = (char *)url; string source = ""; //cout << "Fetching... " << urls << endl; // Get source for url source = page.getpage((char *)url); //cout << "Got page source of " << urls << endl; // Convert source from string to char* char *buf = (char*)malloc((source.size()*8)+1); buf[0] = '\0'; strcpy(buf,source.c_str()); //cout << "About to exit fetchpage" << endl; try { // Finished with thread, so stop it pthread_exit((void *) buf); } catch(void* b) { cout << "Catching pthread exit: " << b << endl; } //cout << "Returning from fetchpage" << endl; return buf;}// Get sources for lots of urls, using pthread and libcurlvoid Fetchwebpages::getsources(){ pthread_t Thread[pages.size()]; char* source[pages.size()]; string ssource[pages.size()]; void *srce; // Create all the threads for(int i=0; i<((int)pages.size());i++) { //cout << "Thread for: " << pages[i].getsiteurl() << " i: " << i << endl; pthread_create( &Thread[i], NULL, fetchpage,(void *)(pages[i].url).c_str()); } // Join all the threads //cout << "off to join threads " << endl; for(int i=0; i<((int)pages.size());i++) { //cout << "off to join " << i << endl; //cout << "thread: " << Thread[i] << endl; // srce should contain the page source after join int res = pthread_join ( Thread[i], &srce ); //cout << "come back from join" << endl; // Check if join was successful if(res != 0) { cout << "Error joining thread: " << res << endl; return; } //cout << "Joined successfully " << i << endl; // Check thread returned a source if(srce != NULL) { //cout << "srce != null" << endl; // Convert page source to string source[i] = (char *)srce; ssource[i] = source[i]; } else { //cout << "srce == null" << endl; ssource[i] = ""; } free(srce); // Add page source into vector pages[i].source = ssource[i]; }}