2009-10-12 10 views
14

は私がそのタスクの1ビットをしたいワーカースレッドを持って、そしてその後、ユースケースがあるなど通知するまでNSThreadを一時停止するには?

&待機し、一時停止し、別のスレッドから「OK、継続」コマンドの&待機を一時停止します:制御オブジェクトは、ワーカースレッド内で何が起こっているのかについての情報を表示し、そのことを作業者が「シングルステップ」できるようにするためのビューです。

私は私の労働者を持っているという醜いと強引なことはこれです:

NSLog(@"paused"); 
paused = YES; 

while (paused) 
{ 
    [NSThread sleepForTimeInterval:0.25]; 
} 
NSLog(@".. continuing"); 

...しかし、私は助けるが、おそらくNSLocksを含む、よりよい方法がなければならないことを考えることはできません、またはそのようなもの。

コメント、ヒントはありますか?

ありがとうございます!

答えて

25

スレッディングガイドのNSConditionConditionsセクションを参照してください。コードは次のようになります。

NSCondition* condition; // initialize and release this is your app requires. 

//Worker thread: 
while([NSThread currentThread] isCancelled] == NO) 
{ 
    [condition lock]; 
    while(partySuppliesAvailable == NO) 
    { 
     [condition wait]; 
    } 

    // party! 

    partySuppliesAvailable = NO; 
    [condition unlock]; 
} 

//Main thread: 
[condition lock]; 
// Get party supplies 
partySuppliesAvailable = YES; 
[condition signal]; 
[condition unlock]; 
+0

まさに私が必要としたものです。ありがとう。 – Olie

+2

また、将来のspelunkersのために: '[condition lockWhenCondition:suppliesAvailable]のようなことをする' NSConditionLock'; mySupplies = [supplyQueueの内容]; [supplyQueue removeAllSupplies]; [条件unlockWithCondition:noSuppliesAvailable]; //必要に応じてmySuppliesを使う」は非常に便利なパターンです。私の場合、partySuppliesではなく、処理が必要なデータとして持っています。 QED。 – Olie

+0

+1パーティを開始するための+1。 :D PartySuppliesAvailableと// Partyの素晴らしい使用! – Alexandru

関連する問題