2009-10-23 9 views
5

Sto scherzando un po 'con le discussioni. Ora considera questo: Ho una discussione principale. Inizio una nuova discussione. Nel suo metodo entry-point, voglio fare un ciclo di esecuzione. Ora la documentazione dice a me che devo avere una fonte di input. Altrimenti il ​​mio ciclo di esecuzione termina immediatamente. cattivo. va bene. ma non ho altre fonti di input delle mie chiamate al metodo performSelector ... Dopo l'avvio del thread, viene fornito un metodo performSelector che kickerà un altro metodo su quel thread dopo un certo ritardo. all'interno di quel metodo avviene un'altra chiamata performSelector, e così via. ognuno con un ritardo tra 0,1 e 1 sec. Quindi un timer ripetuto è insensato giusto ;-)Come creare un ciclo di esecuzione che viene eseguito solo dalle chiamate al metodo performSelector ...?

Come posso impostare quel ciclo di esecuzione in modo che tenga vivo ricevere i calci da performSelector? Voglio che il thread si addormenti quando non c'è niente da fare. ma quando un calcio performSelector sta arrivando nel suo culo, voglio che il filo si riattivi e funzioni.

Qualche suggerimento, qualcuno?

risposta

-1

Non descrivi ciò che stai VERAMENTE cercando di fare, quindi è difficile da dire, ma sembra che tu stia complicando un po 'le cose.

Credo che si desideri avere un solo thread (avviato come più vi piace) e che il thread dovrebbe utilizzare NSCondition/NSLock per dormire fino a quando non si desidera che si riattivi.

Vedi this S.O. thread per una domanda simile e una buona risposta che spiega come farlo:

+0

Mentre si potrebbe implementare il modello produttore-consumatore richiesto in questo modo, sarebbe aggiungere un sacco di codice aggiuntivo che è costruito in cicli eseguiti. Sanno già come rispondere ai selettori, quindi non è necessario creare oggetti con condizioni aggiuntive per gestire i messaggi. –

3

Il codice che si desidera è spiegato nella figura 3-14 in Run Loops nella Guida Threading programmazione. Ma è sepolto così bene in altre discussioni che se non capisci tutto il resto in questa pagina, non saprai esattamente cosa stai guardando. Leggere quella sezione, e poi questo codice, si spera, dare un senso:

- (void)startRunLoop:(id)sender 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Any thread setup 

    do 
    { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
           beforeDate:[NSDate distantFuture]]; 
    } while (self.isStarted); 

    // Any thread cleanup 

    [pool release]; 
} 
+4

Proviso: Come per il documento a cui ti sei collegato, devi prima impostare una sorgente di input o eseguire un evento di loop di qualche tipo, altrimenti il ​​ciclo di esecuzione uscirà immediatamente, portando il thread al 100% di utilizzo della CPU mentre attende i comandi. Il modo più semplice per farlo è con una porta fittizia: '[[NSRunLoop currentRunLoop] addPort: [porta NSMachPort] forMode: NSDefaultRunLoopMode]' –

Problemi correlati