2016-12-01 2 views
0

문제 : 다른 프로세서를 많이 사용하는 비 UI 코드가 즉시 호출되면 applicationWillFinishLaunching에서 텍스트가있는 창을 표시하려고 시도하지 않습니다.응용 프로그램 시작 직후 NSWindow가 그려지지 않습니다.

배경 : 시작시 최종 사용자와 상호 작용할 수도 있고 그렇지 않을 수도있는 도우미 응용 프로그램이 있습니다. 사용자 질문을하기 위해 창을 띄워야하는지 여부를 "결정"하는 동안 1 초에서 10 초 사이가 걸릴 수 있습니다 (인터넷을 통해 통신 할 수있는 UI가 아닌 라이브러리 코드에서 시작됩니다).

그래서 나는 그 사용자에게 친절하고 그 라이브러리 코드로 향하기에 앞서 "작업중 인, 잠시 기다려주십시오 ..."라는 창이 나타나기를 바란다. 경과되었습니다.

이 미니 경고 (심지어 NSView, 일부 텍스트 및 버튼이없는 NSWindow)를 그릴 때도 앱 자체가 실행 후 시간이없는 것처럼 보입니다.

라이브러리 코드가 반환 된 후 사용자에게 오류 경고 또는 쿼리 창을 표시하려는 경우 해당 시점에 미니 경고가 예상대로 그립니다. 그러나 미니 알림 (아래 참조)을 닫은 다음 NSAlert를 설정하면 미니 알림에 충분한 시간이 없습니다.

- (void)applicationWillFinishLaunching:(NSNotification *)notification 
{ 
    [NSApp activateIgnoringOtherApps:YES]; 

    briefAlertWindowController = [[NSWindowController alloc] initWithWindowNibName:@"BriefAlertWindow"]; 

    [[briefAlertWindowController window] center]; 
    [briefAlertWindowController showWindow:self ]; 
    [[briefAlertWindowController window] orderFront:self ]; 
    [[briefAlertWindowController window] display]; 
    [[briefAlertWindowController window] makeKeyAndOrderFront:nil]; 
} 

및 미니 경고를 기각 : NSWindow 표시하지 NSWindowController도가/파생 된이 미니 경고에 대해 서브 클래스되었는지

- (void)dismissMiniAlert 
{ 
    NSWindow * theWindow = [briefAlertWindowController window]; 
    [theWindow orderOut:nil]; 
} 

참고.

  • 사람들이 "스플래시 화면"에 대해 짜증을 내기 때문에 "미니 경고"라는 용어를 사용하고 있습니다. 기능은 비슷하지만 실제로 필자는 어쩔 수없이 오래 작업이 진행 중임을 사용자에게 알리려 고합니다.

답변

2

스레딩 문제가있는 것 같습니다. 주 스레드가 프로세서를 많이 사용하는 작업을 수행하기 때문에 스플래시 창은 주 스레드에서 자체를 그릴 수 없습니다. 제대로, 당신의 프로세서 - 집중적 인 것들은 모두 배경 스레드에서 일어나야합니다. 그렇게 할 수 없다면 최소한 runloop에 창을 그리는 기회를주기 위해 주 스레드에서 빠져 나올 필요가 있습니다. 그냥 지연을 소개합니다.

+0

분명히 정확합니다. 계속하기 전에 약간의 지연 만 있으면됩니다. runloop을 막지 않는 지연을 도입하는 최선의 방법에 대한 제안? 나는 수면을 시도했지만 분명히 효과가 없습니다. – SMGreenfield

+1

일반적인 방법은'dispatch_after'입니다. 또는'performSelector : afterDelay :'. – matt

+0

하지만 메인 쓰레드에서 프로세서 집약적 인 것들을 얻는 것에 관해서 말한 것은 여전히 ​​의미합니다. 10 초 동안 메인 스레드를 잡고 있으면 피자가 돌아가고 사용자는 아무 것도 할 수 없으며 종료하지 않습니다. – matt