0

还是个可可菜鸟,

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

while (preProcessed == FALSE){}

这会在主线程任务完成时占用线程一两秒钟(涉及 webview - 因此需要主线程)。

它运行良好,应用程序已提交给 Apple,一切都很好。

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

即使我添加任意动作,例如

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

什么都没发生..

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

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

它完美地工作。

我的问题是,到底发生了什么!其次,是什么改变了它的行为方式,因为它肯定不是我的应用程序。

4

2 回答 2

1

这些陈述:

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

实际上不要做任何事情,因为没有读取任何内容idle_hands_etc,因此编译器已对其进行了优化。这将在您的应用程序的发布构建期间发生,而不是在调试构建期间,当优化被关闭时。

另一种可能性是preProcessed没有用volatile限定符声明,编译器可能需要它来认为它是可变的。

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

于 2013-01-23T12:01:22.430 回答
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:
于 2013-01-23T12:06:53.763 回答