NSRunLoop вызывает мой селектор после долгой задержки

Постановка проблемы: у нас есть один вторичный поток, в котором мы выполняем всю внутреннюю обработку. В этом вторичном потоке мы создали отдельный NSRunLoop для запуска. мы создаем и используем таймер в этом цикле выполнения

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

Все работает нормально, за исключением того, что один из вызовов селектора выполняется почти 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 находится в другом режиме.

Есть ли способ заставить фонд выполняться с наивысшим приоритетом, то есть то, что когда-либо выполнялось в цикле выполнения, было прервано или что-то в этом роде.


person Yasir Perwez    schedule 14.05.2012    source источник


Ответы (2)


Вы можете создать NSTimer и установить дату запуска сейчас. См. пример кода ниже.

  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];
person Mary Tony    schedule 14.05.2012
comment
К этому циклу выполнения прикреплен таймер. И многие другие исполнительные селекторы в потоке работают, но эта функция не получает вызов из-за большой задержки. Причина может заключаться в том, что цикл выполнения что-то обрабатывает, но мое требование состоит в том, чтобы обработать func как можно скорее с очень высоким приоритетом. - person Yasir Perwez; 14.05.2012

Я отвечаю на свой вопрос. Мой цикл выполнения ждал NSInputStream: read, когда не было байта для чтения. Таким образом, функция была поставлена ​​в очередь в источнике цикла выполнения, но поскольку поток ожидает чтения сокета, ничего не выполняется.

Я узнал об этом, когда подключил runloop и увидел, что он там застревает.

person Yasir Perwez    schedule 15.05.2012