睡一个长时间的过程

时间:2016-09-07 13:28:23

标签: multithreading macos cocoa thread-sleep

我有一个使用各种枚举器(例如目录枚举器)迭代数万条记录的应用程序

我看到操作系统X说我的进程是"抓住了燃烧的CPU"因为它占用了大量的CPU。

我想做的是建立一个压力阀"比如

[NSThread sleepForTimeInterval:cpuDelay];

不会阻止像双核机器这样的其他进程/线程。

我的处理是在一个单独的线程上进行的,但是我无法突破并重新进入枚举器循环并使用NSTimers来让机器“呼吸”#34;

任何建议 - [NSThread sleepForTimeInterval:cpuDelay];应该有效吗?

我在调度队列中运行这些东西:

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


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

1 个答案:

答案 0 :(得分: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)
}