2013-01-23 26 views
0

仍然是一個可可新秀,可可空循環衰竭

我有這個循環中,我的應用程序的後臺線程執行:

while (preProcessed == FALSE){} 

這豬線程的一兩秒鐘,而主線程任務完成(涉及webview - 因此需要主線程)。

它工作完美,該應用程序已提交給蘋果,都很好。

現在,突然 - 它已停止工作。循環要麼永遠不會退出,要麼永遠不會開始,基本上應用程序只是靜靜地停留在這一點上。

即使我添加任意的動作,如

int idle_hands_etc = 0; 
while (preProcessed == FALSE){ ++idle_hands_etc;} 

沒有任何反應..

但是,如果我打印的東西輸出控制檯:

while (preProcessed == FALSE){ printf(".");} 

它完美。

我的問題是,到底發生了什麼!其次,爲了使其行爲不同,發生了什麼變化,因爲它當然不是我的應用程序。

+1

我懷疑編譯器已經認識到這些語句*不會做任何事*並優化它們。 – trojanfoe

+2

你確定,你還沒有重新定義錯誤或預處理? –

回答

1

這些語句:

int idle_hands_etc = 0; 
while (preProcessed == FALSE){ ++idle_hands_etc;} 

實際上不做任何事情如無物從idle_hands_etc讀取,所以編譯器優化他們出來。這將發生在版本構建您的應用程序,而不是在調試構建,當優化關閉。

另一種可能性是,preProcessed沒有與volatile預選賽中,編譯器要考慮它的可變可能需要申報。

這種類型的等待循環的效率低下無論如何,你需要調查多線程的同步機制,允許線程睡眠雖然它不工作,並允許它當任務是在等待完成喚醒。

0
I have this loop executing in the background thread of my application: 

while (preProcessed == FALSE){} 
This hogs the thread for a second or two while a main-thread task completes (involving a webview - hence main thread required). 

無需使用虛擬環路吃幾秒鐘,就可以直接控制等待,直到當前的任務不被處理。你可以選擇下面的方法,用YES作爲waitUntilDone

performSelector:onThread:withObject:waitUntilDone: 
+0

預處理標誌由[webView didReceiveTitle]設置,因此waitUntilDone無法識別何時收到標題。基本上,我使用WebView呈現引擎來解析一些HTML。 JavaScript所做的最後一件事是將頁面標題設置爲「完整」 - didRecieveTitle標識此標誌,設置標誌並返回後臺線程以保存格式化的HTML。 –