2011-05-12 111 views
4

我有一个处理线程用于填充数据缓冲区。在其他地方,一个硬件会触发一个从该数据缓冲区读取的回调。处理线程然后启动并重新填充缓冲区。iOS线程等待操作

当缓冲区填满我现在告诉线程通过等待:

while([self FreeWriteSpace] < mProcessBufferSize && InActive) { 
    [NSThread sleepForTimeInterval:.0001]; 
} 

然而,当我的档案I am收到了很多在睡眠中度过的CPU时间。有更好的方法等待吗?我甚至在乎配置文件是否说时间花在了睡眠中?

+0

考虑使用NSOperation来代替它,因为它有一个可以指定的完成块,所以当操作完成后,您可以获取通知。 – logancautrell 2011-05-12 18:29:07

回答

8

在睡眠中度过的时间实际上是免费的。在乐器中,请看“运行样品”而不是“所有样品”。但这仍然不是一个理想的解决方案。

首先,你的睡眠时间间隔是疯狂的。你真的需要0.1微米的粒度吗?系统几乎肯定不会给你,因为处理器速度不是那么快。我必须相信你可以将它提升到.1或.01。但是,这仍然是忙碌的等待,如果你可以帮助它,这是不理想的。

更好的解决方案是使用NSCondition。在这个线程中,等待条件,并且在处理线程中,当有空间写入时触发条件。

请注意您的命名。不要用大写字母命名方法(表示它是类名)。并避免像这样直接访问ivars(InActive)。 “InActive”也是一个令人困惑的名字。这是否表示系统处于活动状态(处于活动状态)还是不活动(处于非活动状态)。 Objective-C中的命名非常重要。编译器不会像在C#和C++中那样保护你。好的命名是你如何保持你的程序工作,而ObjC的许多部分依靠它。

您可能还想调查Grand Central Dispatch,它是专门为这类问题设计的。看看dispatch_async()在新数据进入时运行。

+0

感谢您的信息。只需注意:我确实有Instruments设置为'Running Samples',因此我担心。我试图用.0001来模仿一种产量,所以我希望“从不睡得比我需要的时间长”。 – TurqMage 2011-05-12 18:06:07

+0

睡觉0.0001大致相当于根本不睡觉。 – 2011-05-12 18:07:11

+0

这是一个耻辱。我一直认为'睡眠'至少会放弃其他线程的处理器。听起来我甚至在Windows上都是错误的http://www.bluebytesoftware.com/blog/PermaLink,guid,1c013d42-c983-4102-9233-ca54b8f3d1a1。aspx – TurqMage 2011-05-12 18:22:01

2

然而,当我的档案I am得到一个 很多在睡眠中度过的CPU时间。 有更好的方法等待吗?如果配置文件显示时间是 花在睡眠中,我还要关心 吗?

是 - 永远不要轮询。轮询吃掉CPU,使您的应用程序响应速度减慢,吃电池,并且是一种无处不在的浪费。

而是通知。

最简单的方法是使用“在主线程上执行选择器”的变体之一(请参阅NSThread的文档)。或派遣到队列(包括像dispatch_async(dispatch_get_main_queue(), ^{ ... yo, data be ready ...});)。