可可空循环失败

时间:2013-01-23 11:54:34

标签: objective-c xcode cocoa

仍然是可可新秀,

我在我的应用程序的后台线程中执行此循环:

while (preProcessed == FALSE){}

当主线程任务完成时(涉及webview - 因此需要主线程),这会使线程停顿一两秒。

它工作得很好,应用程序已提交给Apple,一切都很好。

现在,突然 - 它已经停止工作了。循环要么永远不会退出,要么永远不会启动,基本上应用程序只是默默地挂起。

即使我添加了任意操作,例如

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

什么都没发生..

但是,如果我将某些内容打印到输出控制台:

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

效果很好。

我的问题是,到底发生了什么!其次,改变了以使其表现不同的原因,因为它肯定不是我的应用程序。

2 个答案:

答案 0 :(得分:1)

这些陈述:

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

实际上不执行任何操作,因为没有从idle_hands_etc读取任何内容,因此编译器已将它们优化出来。这将在应用程序的 Release 版本期间发生,而不是在 Debug 版本期间,当关闭优化时。

另一种可能性是preProcessed未使用volatile限定符声明,编译器可能需要将其视为可变。

这种类型的等待循环无论如何都是低效的,你需要调查多线程同步机制,允许线程在它不工作时 sleep 并允许它在等待的任务时被唤醒完成。

答案 1 :(得分: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: