Почему NSOperation использует 100% цикл процессора, когда ничего не делает? - PullRequest
2 голосов
/ 27 января 2011

Я столкнулся со странным поведением с NSOperation, которое я исправил, но не понимаю.

Я подкласс NSOperation, следуя документации. Когда я использую основной метод ниже, приложение будет использовать 100% или более процессорного времени.

-(void)main 
{
    @try 
    {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

        //Cycle forever until told to cancel
        while (![self isCancelled])
        {

        }

        [pool release];
    }
    @catch(...) 
    {
        // Do not rethrow exceptions.
    }

    //Finish executing
    [self completeOperation]; //Send notificatios using KVO
}

И наоборот, когда я использую следующий основной метод, приложение использует 3% процессорного времени.

-(void)main 
{
    @try 
    {
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

        //Create the initial delayed timers
        NSTimer *startUpTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];

        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addTimer:startUpTimer forMode:NSRunLoopCommonModes];
        [runLoop run];

        //Cycle forever until told to cancel
        while (![self isCancelled])
        {

        }

        [pool release];
    }
    @catch(...) 
    {
        // Do not rethrow exceptions.
    }

    //Finish executing
    [self completeOperation]; //Send notificatios using KVO
}

Это странное поведение, по-видимому, связано с таймером. Если таймеру предлагается не повторяться, приложение использует 100% процессорного времени, но если таймеру предлагается повторить себя, загрузка процессора нормальная.

Похоже, что когда в потоке ничего не работает, загрузка ЦП очень высока (я полагаю, что это будет наоборот) Любые предложения о том, почему это так?

Спасибо.

Ответы [ 2 ]

14 голосов
/ 27 января 2011

Цикл цикла займет 100% одного ядра процессора.Это то, что делает цикл, независимо от того, находится он в очереди или нет.

0 голосов
/ 23 октября 2012

с iPhone эквивалент Application.DoEvents ();

добавьте

        while (![self isCancelled])
        {


 [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]]
        }

и посмотрите, как идут дела.

...