Ho un ciclo while
, che viene eseguito per molti secondi ed è per questo che voglio aggiornare una barra di avanzamento (NSProgressIndicator) durante questo processo, ma si aggiorna solo una volta terminato il ciclo. Lo stesso accade se voglio aggiornare un testo etichetta, tra l'altro.Come aggiorno una barra di avanzamento in Cocoa durante un lungo ciclo di esecuzione?
Credo che il mio ciclo impedisca il verificarsi di altre cose di quell'applicazione. Ci deve essere un'altra tecnica. Questo ha a che fare con discussioni o qualcosa del genere? Sono sulla buona strada? Qualcuno può per favore darmi un semplice esempio, come "ottimizzare" la mia applicazione?
La mia domanda è un'applicazione Cocoa (Xcode 3.2.1) con questi due metodi nel mio 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]; }
Sono davvero una novità per Objective-C, cacao e le applicazioni con un'interfaccia utente. Grazie mille per qualsiasi risposta utile.
Grazie mille, darò è una prova questo fine settimana! – Nick
Questo è quello che stavo cercando.Funziona bene e questo mi dà un buon punto di partenza per saperne di più. Grazie! – Nick
Grazie per questa Enchilada! Ho appena imparato qualcosa che non sapevo! Molto eccitato per scoprire blocchi e GCD !! –