2011-10-26 13 views
3

whileループがCPU使用率を90〜100%にするという奇妙な状況があります。 CPUはこのままです。 whileループをコメントアウトすると、CPUは正常のままです。なぜループが100%CPUを引き起こしているのですか

ここで何が問題になりますか?

私はブレークポイントを入れましたが、whileループは間違いなく終了します。

[self performSelectorInBackground:@selector(checkstate:) withObject:padid]; 



-(void)checkstate:(PadIDSIdentifier*)pids 
    { 

     int pid=0; 
     int cid=0; 
     pid=pids.padid; 
     cid=pids.channelid; 


     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init]; 


     while (change==NO) 
     { 

     // wait for the condition I want 
     change=YES; 




     } 



     [pool release]; 

    } 

答えて

6

あなたはそのループでCPUを食べています。あなたがする必要があるのは、OSがあなたのために待機するようにすることです(待機プロセスが低優先度に設定され、アイドル時間に実行されます)。

Windowsでこれを行う方法は、WaitForSingleObjectです。 iPhoneでこれを行うにはNSConditionが必要です。ここで

がリンクされていますHow do I use NSConditionLock? Or NSCondition

基本的には、NSConditionは、あなたのスレッドが処理を再開することができ、他のスレッドによって通知されます。

+0

が完璧です。 NSTimerもうまくいくようです。私は懸念しているが、私は全体を理解していない "タイトループ"事を出ていない。 – dubbeat

2

CPUがループ内でスタックされています。基本的には、変数の変更が何かに変わるのを待っている時間の100%を丸で囲んでいます。

+0

しかし、それは奇妙なことです。値の変更によって値が変更され、ループは終了します。 – dubbeat

+0

しかし、それが変更される前に、それは "タイトループ"にあります。 – Deleted

+0

申し訳ありませんが、分かりません。私は完全にそれを取得する "間違っている"それはタイトなループにあります。私が得られないことは、「変更」が「真」に変わったときでも、もはやタイトなループではないということです。 – dubbeat

1

表示されているコードは、実行しているコードを正確に反映しているようには見えません。

プログラムが制御されているときは、常に100%CPUを使用しています。 lessを使用する唯一の方法は、オペレーティングシステムに戻ることです。タイトなループを実行すると、OSに戻ってこないので、実行中は100%CPUを使用します。

関連する問題