2009-10-23 6 views
5

私はスレッドをちょっとびっくりしています。今これを考えてみましょう: 私はメインスレッドを持っています。私は新しいスレッドを開始します。エントリポイントメソッドでは、私はループを実行したい。これで、ドキュメントは入力ソースを持っていなければならないと私に伝えます。それ以外の場合は、実行ループがすぐに終了します。悪い。はい。私のperformSelector ...メソッド呼び出し以外の入力ソースはありません。スレッドが開始されると、performSelectorメソッドが呼び出され、何らかの遅延の後にそのスレッドの別のメソッドが実行されます。そのメソッドの中で別のperformSelectorコールが発生するなどです。各々0.1秒と1秒の間の遅延を有する。だから、繰り返し発射タイマーは分かりません;-)performSelector ...メソッド呼び出しだけでキックされる実行ループを作成するには?

PerformSelectorからのキックを受けるように、その実行ループを設定するにはどうすればいいですか?私はスレッドが何もしないときにスリープ状態にしたい。 performSelectorのキックが彼のお尻で行かれているとき、私はスレッドが目を覚まして動作したいと思っています。

提案はありますか?

答えて

-1

本当に何をしようとしているのか説明していないので、わかりにくいですが、少し複雑になっているようです。

私はあなたが好きな方法で蹴飛ばされたスレッドを1つだけ持ちたいと思っています。スレッドはNSCondition/NSLockを使用して目を覚ますまでスリープさせるべきです。

は、同様の質問とそれを行う方法を説明する良い答えをthis S.O. threadを参照してください:

+0

このように、要求されたプロデューサ - コンシューマモデルを実装できますが、実行ループに組み込まれた余分なコードが多く追加されてしまいます。彼らはすでにセレクタに応答する方法を知っているので、メッセージを管理するために余分な条件オブジェクトを作成する必要はありません。 –

3

したいコードがスレッド・プログラミング・ガイドにRun Loopsに図3-14で説明されています。しかし、あなたがこのページの他のすべてを理解していないと、あなたが見ているものをあまり理解していないということは、他の議論ではうまく埋もれています。

- (void)startRunLoop:(id)sender 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Any thread setup 

    do 
    { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
           beforeDate:[NSDate distantFuture]]; 
    } while (self.isStarted); 

    // Any thread cleanup 

    [pool release]; 
} 
+4

Proviso:あなたがリンクしているドキュメントに従って、まず入力ソースを設定するか、何らかの種類のループイベントを実行する必要があります。そうでなければ、実行ループはすぐに終了し、コマンドを待つ間にスレッドを100%CPU使用率にします。私がこれを知っている最も簡単な方法はダミーのポートです: '[[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]' –

関連する問題