仍然是可可新秀,
我在我的应用程序的后台线程中执行此循环:
while (preProcessed == FALSE){}
当主线程任务完成时(涉及webview - 因此需要主线程),这会使线程停顿一两秒。
它工作得很好,应用程序已提交给Apple,一切都很好。
现在,突然 - 它已经停止工作了。循环要么永远不会退出,要么永远不会启动,基本上应用程序只是默默地挂起。
即使我添加了任意操作,例如
int idle_hands_etc = 0;
while (preProcessed == FALSE){ ++idle_hands_etc;}
什么都没发生..
但是,如果我将某些内容打印到输出控制台:
while (preProcessed == FALSE){ printf(".");}
效果很好。
我的问题是,到底发生了什么!其次,改变了以使其表现不同的原因,因为它肯定不是我的应用程序。
答案 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: