为什么NSOperation在没有做任何事情时会使用100%的CPU周期?

时间:2011-01-27 02:40:50

标签: objective-c multithreading cocoa nsoperation

我刚刚遇到NSOperation的一个奇怪的行为,我已修复但不明白。

我按照文档继承了NSOperation。当我使用下面的main方法时,应用程序将使用100%或更多的CPU时间。

-(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%的CPU时间。

-(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%CPU时间,但如果要求计时器重复,则CPU使用率正常。

看来当线程上没有运行时,CPU使用率非常高(我认为它会相反)。为什么会出现这种情况的任何建议?

感谢。

2 个答案:

答案 0 :(得分:14)

循环while循环将占用CPU的单个核心的100%。这就是循环所做的事情,无论是否在队列中。

答案 1 :(得分:0)

截至iPhone equivalent of Application.DoEvents();

添加

        while (![self isCancelled])
        {


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

看看情况如何。