Легкий пример Grand Central Dispatch

Я новичок программист для Mac, и я действительно удивлен Grand Central Dispatch. Я читал об этом и выглядел как идеальное решение для параллельного программирования. Я работал с потоками POSIX и хочу перейти в GCD.

Я видел коды образцов в приложении Apple Developer Connection, но это меня так смутило. Я искал простой пример с двумя потоками, но я не могу его найти.

Как я могу сделать этот пример кода с помощью 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 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;
}

Заранее спасибо

Ответ 1

Это будет примерно так:

// 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);

Ответ 2

Просто заверните код, который должен выполняться асинхронно в блоке, переданном в 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;
}

Обратите внимание, что как в этом примере, так и в вашем приложении приложение действительно вернется немедленно, так как вы ничего не делаете, чтобы отложить возврат из main().

Ответ 3

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

}