Tengo un bucle while
, que se ejecuta durante varios segundos y es por eso que deseo actualizar una barra de progreso (NSProgressIndicator) durante ese proceso, pero se actualiza solo una vez después de que el ciclo ha finalizado. Lo mismo ocurre si quiero actualizar un texto de etiqueta, por cierto.¿Cómo actualizo una barra de progreso en Cocoa durante un ciclo prolongado?
Creo que mi bucle impide que sucedan otras cosas de esa aplicación. Debe haber otra técnica. ¿Tiene esto que ver con hilos o algo? ¿Estoy en el camino correcto? ¿Puede alguien darme un ejemplo simple, cómo "optimizar" mi aplicación?
Mi aplicación es una aplicación Cocoa (Xcode 3.2.1) con estos dos métodos en mi Example_AppDelegate.m
:
// This method runs when a start button is clicked. - (IBAction)startIt:(id)sender { [progressbar setDoubleValue:0.0]; [progressbar startAnimation:sender]; running = YES; // this is a instance variable int i = 0; while (running) { if (i++ >= processAmount) { // processAmount is something like 1000000 running = NO; continue; } // Update progress bar double progr = (double)i/(double)processAmount; NSLog(@"progr: %f", progr); // Logs values between 0.0 and 1.0 [progressbar setDoubleValue:progr]; [progressbar needsDisplay]; // Do I need this? // Do some more hard work here... } } // This method runs when a stop button is clicked, but as long // as -startIt is busy, a click on the stop button does nothing. - (IBAction)stopIt:(id)sender { NSLog(@"Stop it!"); running = NO; [progressbar stopAnimation:sender]; }
Estoy muy nuevo en Objective-C, Cacao y aplicaciones con una interfaz de usuario. Muchas gracias por cualquier respuesta útil.
Muchas gracias, voy a dar Es un intento este fin de semana! – Nick
Eso es lo que estaba buscando.Funciona bien y esto me da un buen punto de partida para aprender más al respecto. ¡Gracias! – Nick
Gracias por esta Enchilada! ¡Acabo de aprender algo que no sabía! Muy emocionado de descubrir sobre bloques y GCD !! –