2012-03-18 12 views
6

Tengo un problema relacionado con la interfaz de usuario/subprocesamiento en el desarrollo de una interfaz de usuario de cacao. La aplicación está diseñada de esta manera:Ejecutar una GUI de Cocoa en un hilo no principal

Tema principal (# 1): analiza los argumentos, las cargas plugins, etc.

hilo Gui (#?): Inicia la interfaz gráfica de usuario, gestiona los eventos, etc. Su interfaz gráfica de usuario del hilo .

El marco de Cocoa no es seguro para subprocesos, pero aplica una regla, la GUI debe ejecutarse en el hilo principal. Una afirmación se usa para verificar esto. Para tratar de evitar esto, implementé el método de ejecución yo mismo (código a continuación) siguiendo esto - http://cocoawithlove.com/2009/01/demystifying-nsapplication-by.html - guía. Pero me estoy perdiendo algo. Se abre una ventana, pero permanece en blanco (completamente blanco). Aunque si hago la llamada en el hilo principal, funciona perfectamente.

Así que, básicamente, necesito descubrir qué falta.

- (void)run 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [self finishLaunching]; 

    shouldKeepRunning = YES; 
    do 
    { 
     [pool release]; 
     pool = [[NSAutoreleasePool alloc] init]; 

     NSEvent *event = 
      [self 
       nextEventMatchingMask:NSAnyEventMask 
       untilDate:[NSDate distantFuture] 
       inMode:NSDefaultRunLoopMode 
       dequeue:YES]; 

     [self sendEvent:event]; 
     [self updateWindows]; 
    } while (shouldKeepRunning); 

    [pool release]; 
} 

- (void)terminate:(id)sender 
{ 
    shouldKeepRunning = NO; 
} 
+0

Parece que debe invertir las cosas para las que está utilizando sus hilos. ¿Por qué luchar contra el marco? –

+1

Porque preferiría no luchar contra la arquitectura de los complementos del programa ... Pero creo que tendré que admitir en este ... – OCarlos

Respuesta

14

Do not. Este enfoque nunca funcionará. Incluso si arregla su problema actual (la ventana no se dibuja) inmediatamente se encontrará con otro problema oscuro e imposible de arreglar, y otro y otro. Cocoa espera que el hilo de la interfaz gráfica de usuario sea el hilo principal, final de la historia.

+0

Pensé tanto, pero quería intentarlo de todos modos ... Gracias por la respuesta. – OCarlos

1

¿Por qué no se solucionó el problema? Haga que el hilo principal engendre un hilo (llamémoslo hilo de la aplicación), luego bloquee antes de generar la GUI. El subproceso de la aplicación analizará argumentos, cargará complementos, etc. Una vez que finalice la inicialización, el subproceso de la aplicación señalará el hilo principal para continuar y ejecutar la GUI.

1

Haga todo en el hilo de fondo excepto la actualización de la GUI. Veo que solo tiene una línea donde necesita actualizar la GUI. Hazlo de la forma en que lo está haciendo, excepto que se ejecuta todas las actualizaciones de interfaz gráfica de usuario en el hilo principal:

dispatch_async(dispatch_get_main_queue(),^
{ 
    [self updateWindows]; 
}); 

Ahora no sé lo que es updateWindows, supuse que esto no crearía una condición de carrera .

Cuestiones relacionadas