0

まだまだカカオ初心者ですが、

アプリケーションのバックグラウンド スレッドで次のループを実行しています。

while (preProcessed == FALSE){}

これにより、メイン スレッド タスクが完了するまでの間、1 ~ 2 秒間スレッドが占有されます (Web ビューを含むため、メイン スレッドが必要です)。

それは完璧に機能し、アプリは 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 に答える