2012-01-11 2 views
2

프로그래밍 방식으로 NSWindow + NSView를 만드는 코코아 기반 명령 줄 응용 프로그램이 있습니다. nextEventMatchingMask 루프를 사용하여 이벤트 루프를 펌핑하고 이벤트를 디스패치합니다. 이 루프는 일부 상위 레벨 코드에 의해 주기적으로 호출되어 입력을 폴링합니다.백그라운드 스레드에서 코코아 메시지 루프 펌핑

주 스레드에서 모든 것을 실행하면보기가 입력 이벤트를 올바르게 수신한다는 점에서 정상적으로 작동합니다.

대신 창 생성 및 메시지 루프를 별도의 스레드로 이동하면 nextEventMatchingMask는 더 이상 이벤트를 반환하지 않으며 뷰는 입력을받지 않습니다.

나는 코코아 앱의 "메인"스레드 만 이벤트를 처리한다고 가정합니다. 그러나이 보조 스레드는 코코아와 대화해야하는 유일한 스레드이므로 코코아에 관한 한 "기본"스레드로 사용하고 싶습니다. 이것이 가능한가? 이 스레드에서 NSApplicationLoad를 호출합니다. 그리고 지금까지이 프로세스에서 호출 된 첫 번째 코코아 함수입니다.

메인 코코아 스레드가 무엇인지 지정할 수 없다면 백그라운드 스레드에서 NSWindow를 만들고 이벤트를받을 수있는 다른 방법이 있습니까? 내가 응용 프로그램의 메인 루프를 제어하지 못하기 때문에 NSApplication Run을 호출하는 것과 같은 일을 할 수 없습니다. 상위 레벨 코드가 요청할 때 Window에서 입력 이벤트를 가져와야합니다.

+0

이 : http://stackoverflow.com/questions/6178618/mac-os-x-is-it-possible-to-imbue-a-non - 메인 - 스레드가 될 메인 스레드가 내 상황과 똑같이 들린다. – eodabash

답변

3

보조 스레드에서 runloop을 시작해야 할 수도 있습니다. 이 스레드 runloop 처리 이벤트를 시작해야

+ (void)launchThread 
{ 
    NSRunLoop *threadRunLoop = [NSRunLoop currentRunLoop]; 
    while (someThreadExitCondition && [threadRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]); 
} 

: 같은 것을 가지고는 ThreadHandler 클래스에서

[NSThread detachNewThreadSelector:@selector(launchThread) 
         toTarget:[ThreadHandler class] 
         withObject:nil]; 

: 당신이 당신의 보조 스레드를 산란 메인 스레드에서, 이런 식으로 뭔가를 호출합니다. 테스트하지 않고서는 이것이 보조 스레드에서 생성 된 창에 대한 이벤트를 처리 할 수 ​​있는지 여부는 모르겠지만 스레드의 runloop을 실행하는 방법을 시작할 수도 있습니다. 메인 이벤트 루프에서 NSConnection을 통해 보조 스레드 (example)로 이벤트를 펌핑하는 분산 객체 상황과 같은 것을 설정할 수도 있습니다. 다행히도 이것은 적어도 당신에게 또 다른 길을 제시 할 것입니다.

+0

제안 해 주셔서 감사합니다. 추가 주름은 문제의이 보조 스레드가 NSThread가 아닌 posix 스레드이며 나에 의해 관리되지 않는다는 것입니다. 주기적으로 코드를 호출하여 이벤트를 확인하여 차단 루프를 입력 할 수 없도록합니다. 어쩌면 내가 설명하는 것처럼 내 자신의 이벤트 처리 스레드를 산란시킬 수 있습니다. 그리고 처리 된 이벤트를 마샬링합니다 (이벤트 처리를하고 있다고 생각하는 스레드로 다시 가져올 수 있다고 가정). – eodabash

1

나는 의존 할 행동이 아닙니다.

실행 루프의 제한을받지 않는 스레드에서 백엔드를 실행해야하는 경우 보조 스레드에서 실행하여 기본 스레드에서 UI를 실행하십시오. 당신이 다른 프로세스를 만들 수 있습니다 또는

, ...

관련 문제