2016-09-07 185 views
0

我有一个应用程序,在使用各种统计员(如目录统计员)睡眠长时间运行的过程

我看到OS X说我的过程“中招烧CPU”,因为其采取记录数以万计的迭代这样做的CPU数量很大。

我想这样做的是建立在一个“压力阀”,如

[NSThread sleepForTimeInterval:cpuDelay]; 

不阻止的事情就像一个双核机的其他进程/线程。

我的处理是发生在一个单独的线程,但我不能摆脱,然后重新输入枚举循环,并使用NSTimers,让机器“呼吸”

任何建议 - 应该[NSThread sleepForTimeInterval:cpuDelay];是工作?

我分派队列中运行这些东西:

if(!primaryTask)primaryTask=dispatch_queue_create(   "com.me.app.task1",backgroundPriorityAttr); 


dispatch_async(primaryTask,^{ 
      [self doSync]; 
     }); 
+0

如果过程过于密集和阻塞事件循环,然后再考虑将其分成处理的更小,时间片块,使线程的事件循环继续处理。 – TheDarkKnight

+0

永不睡觉。决不。 – matt

回答

0

尝试在包装的NSOperation您处理,并设置较低的QoS优先级。这里有一些信息: http://nshipster.com/nsoperation/

这里是我编写的代码示例。操作被触发鉴于加载事件:

let processingQueue = NSOperationQueue() 

override func viewDidLoad() { 

    let backgroundOperation = NSBlockOperation { 
     //My very long and intesive processing 
     let nPoints = 100000000000 

     var nPointsInside = 0 

     for _ in 1...nPoints { 
      let (x, y) = (drand48() * 2 - 1, drand48() * 2 - 1) 
      if x * x + y * y <= 1 { 
       nPointsInside += 1 
      } 
     } 

     let _ = 4.0 * Double(nPointsInside)/Double(nPoints) 
    } 

    backgroundOperation.queuePriority = .Low 
    backgroundOperation.qualityOfService = .Background 

    processingQueue.addOperation(backgroundOperation) 
} 
+0

我在一个优先级的调度队列中运行它 - 这似乎并没有阻止可怕的“Caught burning他CPU”控制台消息 – JeremyLaurenson

+0

试试这个代码,它应该使用不同的机制。 –