2

問題文 : すべてのバックエンド処理を行う 1 つのセカンダリ スレッドがあります。このセカンダリ スレッドでは、実行する別の NSRunLoop を作成しました。このランループでタイマーを作成して使用します

    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
NSRunLoop * threadRL = [NSRunLoop currentRunLoop];
[threadRL addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[threadRL run];
[myPool release];

セレクターへの呼び出しの1つが実行に約10秒かかり、これが毎回ではなくランダムに発生することを除いて、すべてが正常に実行されます。

[myclass performSelector:@selector(func) onThread:myThread withObject:nil waitUntilDone:NO];

これも試してみましたが、違いはありませんでした。

[myclass performSelector:@selector(func) onThread:myThread withObject:nil waitUntilDone:NO modes:[NSArray arrayWithObjects: NSDefaultRunLoopMode, NSRunLoopCommonModes,nil]];

私はおそらくこれほど時間がかかる可能性のあるタスクを func で行っていません。

私が考えているのは、runloop が別のモードになっている可能性があるということです。

ファンドを最優先で実行する方法はありますか。つまり、ランループで実行されているものを中断するなどです。

4

2 に答える 2

0

私は自分の質問に答えています。私のランループは、読み取るバイトがないときに NSInputStream:read を待っていました。そのため、関数は runloop ソースでキューに入れられていましたが、スレッドがソケット読み取りで待機しているため、何も実行されませんでした。

runloop をフックして、そこに詰まっているのを見たときに、これを知りました。

于 2012-05-15T12:36:15.443 に答える
0

NSTimer を作成し、firedate を now に設定できます。以下のサンプルコードをご覧ください。

  NSTimer *timer = [[NSTimer alloc] initWithFireDate:now
                                                  interval:.01
                                                    target:myClass
                                                  selector:@selector(funct)
                                                  userInfo:nil
                                                   repeats:NO];

   NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
        [runLoop run];
于 2012-05-14T11:08:16.920 に答える