2011-05-12 145 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 ...});)。