2011-03-31 11 views
10

yo soy novato de programación para Mac y estoy realmente sorprendido de Grand Central Dispatch. Leí sobre eso y parece ser la solución perfecta para programación paralela. Trabajé con hilos POSIX y quiero moverme a GCD.Fácil ejemplo de Grand Central Dispatch

vi los códigos de muestras en el Centro de desarrollo de Apple, pero me confundió tanto. Busqué un ejemplo fácil con dos hilos para comenzar, pero no puedo encontrarlo.

¿Cómo puedo hacer que este código de ejemplo usando GCD ???

#include <stdio.h>  /* standard I/O routines     */ 
#include <pthread.h>  /* pthread functions and data structures */ 

/* function to be executed by the new thread */ 
void* do_loop(void* data) 
{ 
int i;   /* counter, to print numbers */ 
int j;   /* counter, for delay  */ 
int me = *((int*)data);  /* thread identifying number */ 

for (i=0; i<10; i++) 
{ 
    for (j=0; j<500000; j++) /* delay loop */ 
    ; 
    printf("'%d' - Got '%d'\n", me, i); 
} 

/* terminate the thread */ 
pthread_exit(NULL); 
} 
void* th2(void* data) 
{ 
cout << "Thread nº 2" << endl; 
} 

int main(int argc, char* argv[]) 
{ 
int  thr_id;   /* thread ID for the newly created thread */ 
pthread_t p_thread1; 
pthread_t p_thread2;  /* thread's structure      */ 
int  a   = 1; /* thread 1 identifying number   */ 
int  b   = 2; /* thread 2 identifying number   */ 

/* create a new thread that will execute 'do_loop()' */ 
thr_id = pthread_create(&p_thread1, NULL, do_loop, (void*)&a); 
/* run 'do_loop()' in the main thread as well */ 
thr_id = pthread_create(&p_thread2, NULL, th2, (void*)&b); 


return 0; 
} 

Gracias de antemano

Respuesta

11

que sería algo como esto:

// The block replaces your doLoop function, it basically does the same thing 
dispatch_block_t myBlock = ^{ 
    int i;   /* counter, to print numbers */ 
    int j;   /* counter, for delay  */ 

    dispatch_queue_t me = dispatch_get_current_queue();  /* The queue which currently runs this block */ 

    for (i=0; i<10; i++) 
    { 
     for (j=0; j<500000; j++) /* delay loop */ 
      ; 


     printf("'%s' - Got '%d'\n", dispatch_queue_get_label(me), i); // Print the name of the queue 
    } 
}; 


// Create two queues 
dispatch_queue_t queue1 = dispatch_queue_create("my.totally.unique.and.reverse.dns.identifier.1", NULL); 
dispatch_queue_t queue2 = dispatch_queue_create("my.totally.unique.and.reverse.dns.identifier.2", NULL); 

// Let both execute the block 
dispatch_async(queue1, myBlock); 
dispatch_async(queue2, myBlock); 

// And then release the queues because we are great citizens who care about memory 
dispatch_release(queue1); 
dispatch_release(queue2); 
9

Simplemente envuelva el código que necesita para funcionar de forma asíncrona en un bloque pasado a dispatch_async():

int main(int argc, char* argv[]) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
    ^{ 
     // This code runs asynchronously! 
     for (unsigned long long i = 0ULL; i < 100000000000ULL; i++) { 
      cout << i << endl; 
     } 
    }); 

    return 0; 
} 

Tenga en cuenta que tanto en este ejemplo como en el suyo, la aplicación realmente regresará inmediatamente ya que usted no hacer nada para diferir el retorno de main().

+0

Sí, Jonathan tiene usted razón. Me olvido de poner mi ejemplo de la instrucción 'pthread_join' en el programa principal para esperar hasta que los hilos terminen para finalizar el programa principal. Las instrucciones son equivalentes a 'pthread_join' para GCD. Muchas gracias por sus respuestas. Eso fue muy útil para mí. –

1
-(void)Search_load_Scraping{ 

    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus internetStatus = [reachability currentReachabilityStatus]; 
    if (internetStatus != NotReachable) 
    { 



    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
        ^{ 

         TrainInfo *TrnObj=[[TrainInfo alloc]init]; 
         ScrapingClass *scrap=[[ScrapingClass alloc]init]; 
         TrnObj= [scrap train_information: [NSString stringWithFormat:@"http://erail.in/Rail/getPNRStatusAsynch.aspx?Data=%@",pnr_no]]; 

         // NSLog(@"NAME..... %@ NO %@ Date %@ Class  %@ \ndes==%@\n %@  \n Dep time %@  Arr time %@ PASSENGER%@  Class  %@", TrnObj.TrainName,TrnObj.TrainNumber,TrnObj.TrainDate,TrnObj.TrainBokingSts,TrnObj.TrainBoarding,TrnObj.TrainDestination,TrnObj.TrainDepTime,TrnObj.TrainArrivalTime,TrnObj.trainTicDictionary,TrnObj.TrainClass); 

         dispatch_sync(dispatch_get_main_queue(), ^{ 
          //If self.image is atomic (not declared with nonatomic) 
          // you could have set it directly above 
          [activityIndicator stopAnimating]; 

          if ([TrnObj.TrainNumber length]>3){ 


//**********************    ************************ 
           [dbSingleton() createEditableCopyOfDatabaseIfNeeded]; 
           if ([dbSingleton() checkpnrEsistence:pnr_no]>0) 
           { 
    //      [dbSingleton() deletePnr:pnr_no]; 
            [dbSingleton() update_Pnr:TrnObj.TrainName trainNumber:TrnObj.TrainNumber chartPrepared:TrnObj.TrainChart className:TrnObj.TrainClass alight_code:TrnObj.TrainDestinationCode alight_name:TrnObj.TrainDestination board_code:TrnObj.TrainBoardingCode board_name:TrnObj.TrainBoarding from_code:TrnObj.TrainDestinationCode from_name:TrnObj.TrainBoarding tr_date:TrnObj.TrainDate to_code:TrnObj.TrainDestinationCode to_name:TrnObj.TrainDestination BordTime:TrnObj.TrainDepTime FromTime:TrnObj.TrainDepTime ToTime:TrnObj.TrainArrivalTime PNR_number:pnr_no]; 

           } 

           [activityIndicator stopAnimating]; 
           NSArray *seatdetails=[TrnObj.trainTicDictionary objectForKey:@"passengers"]; 

      NSLog(@"SCRAPING self.seat_details %@",self.seat_details); 

           for(int i=0;i<seatdetails.count;i++) 
           { 
            NSString *seat_number=[NSString stringWithFormat:@"%@",[[seatdetails objectAtIndex:i] objectForKey:@"booking_status"]]; 
            NSString *seat_status=[NSString stringWithFormat:@"%@",[[seatdetails objectAtIndex:i] objectForKey:@"current_status"]]; 
            int roeid=[[[seatdetails objectAtIndex:i] objectForKey:@"rowid"] intValue]; 

            [dbSingleton() Update_Passenger:seat_number seat_status:seat_status pnr_number:pnr_no Row_ID:roeid]; 

           } 


//******************************  bord   ************************************ 
           NSMutableDictionary *resDicBor=[[NSMutableDictionary alloc]init]; 
           [resDicBor setValue:TrnObj.TrainBoardingCode forKey:@"code"]; 
           [resDicBor setValue:TrnObj.TrainBoarding forKey:@"name"]; 
           [resDicBor setValue:TrnObj.TrainDepTime forKey:@"time"]; 

           NSMutableDictionary *resB=[[NSMutableDictionary alloc]init]; 
           [resB setValue:resDicBor forKey:@"boarding_point"]; 
      NSLog(@"SCRAP resB.%@",resB); 

//*******************************  des    ******************************** 
           NSMutableDictionary *resDicDES=[[NSMutableDictionary alloc]init]; 
           [resDicDES setValue:TrnObj.TrainDestinationCode forKey:@"code"]; 
           [resDicDES setValue:TrnObj.TrainDestination forKey:@"name"]; 
           [resDicDES setValue:TrnObj.TrainArrivalTime forKey:@"time"]; 

           NSMutableDictionary *resD=[[NSMutableDictionary alloc]init]; 
           [resD setValue:resDicDES forKey:@"reservation_upto"]; 
     NSLog(@"SCRAP resD.%@",resD); 
//*******************************     ************************************* 
           NSMutableDictionary *resDicFro=[[NSMutableDictionary alloc]init]; 
           [resDicFro setValue:TrnObj.TrainBoardingCode forKey:@"code"]; 
           [resDicFro setValue:TrnObj.TrainBoarding forKey:@"name"]; 
           [resDicBor setValue:TrnObj.TrainDepTime forKey:@"time"]; 

           NSMutableDictionary *resF=[[NSMutableDictionary alloc]init]; 
           [resF setValue:resDicFro forKey:@"from_station"]; 
     NSLog(@"SCRAP resF.%@",resF); 




           self.travel_details=[[NSMutableArray alloc]init]; 
           [self.travel_details addObject:[resD objectForKey:@"reservation_upto"]]; 
           [self.travel_details addObject:[resB objectForKey:@"boarding_point"]]; 
           [self.travel_details addObject:[resF objectForKey:@"from_station"]]; 
     NSLog(@"SCRAP from_station....%@",[resF objectForKey:@"from_station"]); 
           self.seat_details=[TrnObj.trainTicDictionary objectForKey:@"passengers"]; 
     NSLog(@"SCRAP passengers....%@",TrnObj.trainTicDictionary); 
           self.pnr_detail_array=[[NSMutableArray alloc]init]; 
           [self.pnr_detail_array addObject:TrnObj.TrainNumber]; 
     NSLog(@"SCRAP train_number....%@",TrnObj.TrainNumber); 

           NSDateFormatter* Dformatter1 = [[NSDateFormatter alloc] init]; 
           [Dformatter1 setDateFormat:@"yyyy-MM-dd"]; 
           NSDateFormatter* Dformatter2 = [[NSDateFormatter alloc] init]; 
           [Dformatter2 setDateFormat:@"dd-MM-yyyy"]; 

           NSDate *TDate=[Dformatter1 dateFromString: TrnObj.TrainDate]; 
           NSString *trDat=[Dformatter2 stringFromDate:TDate]; 
           [self.pnr_detail_array addObject:trDat]; 

//  [self.pnr_detail_array addObject:[json objectForKey:@"doj"]]; 
     NSLog(@"SCRAP date....%@",trDat); 
           [self.pnr_detail_array addObject:TrnObj.TrainName]; 
           self.pnr_no=pnr_no; 

           if([TrnObj.TrainChart isEqualToString:@"N"]) 
           { 
            [self.pnr_detail_array addObject:@"Chart Not Prepared"]; 
           } else{ 
            [self.pnr_detail_array addObject:@"Chart Prepared"]; 
           } 
           [self.pnr_detail_array addObject:@""]; 
           [self.pnr_detail_array addObject:TrnObj.TrainClass]; 

       //*************update seat detail 







           [email protected]""; 
           for(int i=0;i<seat_details.count;i++) 
           { 
            str_seat_detail=[str_seat_detail stringByAppendingString:[NSString stringWithFormat:@"%@-%@\n",[[seat_details objectAtIndex:i] objectForKey:@"booking_status"],[[seat_details objectAtIndex:i] objectForKey:@"current_status"]]]; 
           } 

       NSLog(@" SCRAP str_seat_detail %@",str_seat_detail); 
           [table_view reloadData]; 

          }else{ 

          if (delegateObj.ScrapStatus==1) { 

          [self performSelector:@selector(getLoginData) withObject:nil afterDelay:0.0]; 
           UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"Trying Again" 
                        delegate:self cancelButtonTitle:nil 
                      otherButtonTitles:nil]; 
           [alertView show]; 
           [self performSelector:@selector(byeAlertView:) withObject:alertView afterDelay:0.5]; 
          }else{ 
           [activityIndicator stopAnimating]; 
           UIAlertView *alert =[[UIAlertView alloc]initWithTitle:nil message:@"Either the PNR is not generated or the travel date is in the past." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
           [alert show]; 
           } 
          } 

         }); 
        }); 

    }else 
    { 
     [activityIndicator stopAnimating]; 
     UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Oops!" message:@" Try again later." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 

} 
Cuestiones relacionadas