2012-05-14 6 views
2

문제 설명 : 모든 백엔드 처리를 수행하는 보조 스레드가 하나 있습니다.이 보조 스레드에서 실행할 NSRunLoop을 별도로 생성했습니다. 우리가 만들고NSRunLoop이 오랜 지연 후 셀렉터를 호출 중임

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

모든 일을 실행하기 위해 거의 10 초를 복용하는 선택 호출 중 하나를 제외하고 잘 실행이 runloop에서 타이머를 사용하고이 때마다 무작위로 발생하지.

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

나는 차이점도없이 이것을 시도했다. 나는 아마도이 정도의 시간이 걸릴 수 FUNC에서 모든 작업을 수행하고 있지 않다

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

내가 생각하고하는 것은 다른 모드에서 runloop이라고 할 수있을 것입니다.

펀드를 최고 우선 순위로 실행하는 방법이 있습니까? 즉, 런 루프에서 실행되고있는 항목이 중단되거나 이와 유사한 상황이 발생하게 할 수 있습니까?

답변

0

NSTimer를 만들고 firedate를 지금으로 설정할 수 있습니다. 아래 샘플 코드를 참조하십시오.

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]; 
+0

이 런 루프에는 타이머가 부착되어 있습니다. 그리고 스레드의 다른 많은 performselector가 작동하지만이 func은 오랜 지연을 요구하지 않습니다. 그 이유는 실행 루프가 무언가를 처리하고있을 수 있습니다. 그러나 제 요구 사항은 func를 매우 우선 순위로 처리하는 것입니다. –

0

나는 내 자신의 질문에 대답하고있다. NSInputStream에서 기다리고있는 내 runloop : 읽을 바이트가 없을 때 읽음. 그래서 func은 runloop 소스에 대기 중이지만 스레드가 소켓 읽기를 기다리고 있으므로 아무 것도 실행되지 않았습니다.

나는 runloop을 구부리고 거기에 갇히는 것을 보았을 때 이것을 알게되었습니다.