2013-01-23 28 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。 –