SMGreenfield
SMGreenfield

Reputation: 1720

NSWindow won't draw immediately after app launch

The problem: Attempting to display a window with text from applicationWillFinishLaunching will NOT draw itself if other processor-intensive non-UI code is immediately called.

Background: I have a helper app that when launched may or may not interact with the end user. While it is "deciding" if it needs to put up a window to ask user questions, there may be anywhere from 1 second to 10 seconds that elapse (after launch it's off in non-UI capable library code communicating over the internet).

So I wanted to be kind to the user and put up a "mini-alert"* window with "working, please wait...", prior to heading into that library code, which I will dismiss once that processing has elapsed.

It seems as if the app itself doesn't have time after launch to even draw this mini-alert (it's just an NSWindow, with an NSView, some text, and no buttons).

If after the library code returns and want to put up either an error alert or a query window for the user -- then at that point the mini-alert draws as expected. However, if I close the mini-alert (see below) and then put up an NSAlert -- the mini-alert doesn't have enough time to dismiss itself.

- (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];
}

and dismissing the mini-alert:

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

NOTE that neither NSWindow not NSWindowController have been derived/subclassed for this mini-alert.

Upvotes: 1

Views: 362

Answers (1)

matt
matt

Reputation: 535118

It sounds like a threading problem. The splash window can't draw itself on the main thread because the main thread is busy doing the processor-intensive operation. Properly, your processor-intensive stuff should all be happening on a background thread. If you can't do that, you need at least to get off the main thread long enough to give the runloop a chance to draw your window. Just introduce a delay.

Upvotes: 3

Related Questions