5

スレッドを少しいじっています。これを考えてみましょう: 私はメインスレッドを持っています。新しいスレッドを開始します。そのエントリポイント メソッドで、実行ループを作成します。ドキュメントには、入力ソースが必要であることが記載されています。そうしないと、実行ループがすぐに終了します。悪い。わかった。しかし、performSelector... メソッド呼び出し以外の入力ソースはありません。スレッドが開始された後、少し遅れてそのスレッドで別のメソッドを起動する performSelector メソッドが来ます。そのメソッド内で、別の performSelector 呼び出しが発生します。それぞれ 0.1 ~ 1 秒の遅延があります。したがって、繰り返し起動するタイマーは無意味です;-)

performSelector からキックを受信するために生き続けるように、その実行ループを設定するにはどうすればよいですか? 何もすることがないときはスレッドをスリープさせたい。しかし、彼のお尻に performSelector キックが来ているときは、スレッドが起動して動作するようにしたいと考えています。

何か提案はありますか?

4

2 に答える 2

3

必要なコードは、Threading Programming Guide の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];
}
于 2009-10-26T18:52:33.340 に答える
-1

本当にやろうとしていることを説明していないので、見分けるのは難しいですが、物事を少し複雑にしすぎているように思えます。

スレッドを 1 つだけ (好きな方法で開始) したいと考えており、そのスレッドは NSCondition/NSLock を使用して、ウェイクアップするまでスリープする必要があります。

同様の質問とその方法を説明する適切な回答については、この SO スレッドを参照してください。

于 2009-10-25T15:59:34.813 に答える