2012-03-16 8 views
7

1.Io ho degli infinte loops come posso ottenere il consumo della CPU più basso? Dovrei usare un ritardo?Come ottenere il consumo della CPU più basso quando si ha un loop infinito in una discussione

2. Se ho più thread in esecuzione nella mia applicazione e uno di questi è THREAD_PRIORITY_IDLE, interessa anche altri thread?

Il mio codice è come questo per ogni thread

procedure TMatchLanLon.Execute; 
begin 
while not Terminated do 
    begin 
      //some code 
      Sleep(1000); 
    end; 
end; 
+0

Aggiungi la tua versione Delphi, per favore. È importante per le domande relative ai thread. – TLama

+0

@TLama mia versione delphi è XE2 – opc0de

+1

Duplicato di [tua domanda] (http://stackoverflow.com/questions/9715378/infinite-loops-in-separate-threads "loop infiniti in thread separati")? –

risposta

9

Tipicamente un filo dovrebbe dormire fino segnalato, ma non utilizzando Sleep o SleepEx.

È possibile creare un evento e attendere che venga segnalato, utilizzando TEvent o direttamente all'API Win32 con WaitForSingleObject.

Sleep causa così tanti problemi, tra cui quello che io chiamo malattia "Bella addormentata". L'intero resto della vostra applicazione è terminato e chiuso alcune centinaia di microseconds e il vostro thread ha dormito per "milioni di anni" in termini di tempo relativo al computer, e quando si risveglia il resto della vostra applicazione è da tempo terminato. La prossima cosa che il thread in background probabilmente farà è accedere ad alcuni oggetti a cui ha un riferimento, che è stato congelato, e quindi (se sei fortunato) si bloccherà. Non utilizzare Sleep nelle discussioni. Attendere gli eventi o utilizzare un thread di lavoro precostruito (come quello OmniThreadLibrary).

+4

Se il thread sta eseguendo codice (diverso da sleep), potrebbe ancora farlo dopo che l'applicazione è stata chiusa. Un ciclo semplice o un'operazione complessa può richiedere anche secondi durante i quali non c'è interazione con il resto dell'applicazione. Quindi dormire non è male in questo senso. Se il tuo thread si arresta in modo anomalo dopo una sospensione, potrebbe anche bloccarsi dopo (o durante) un'altra operazione. Non è detto che usare il sonno in una discussione sia buono, ma la ragione che descrivi non lo è neanche. – GolezTrol

+4

Windows interrompe tutti i thread all'uscita dell'applicazione prima di deallocare qualsiasi risorsa. Sleep() va benissimo nei thread - lo sto usando, (per i suoi scopi, non come una gruccia di polling in un'applicazione con problemi di comunicazione), per decenni. –

+0

'Se il thread sta eseguendo il codice (diverso da sleep), potrebbe ancora farlo dopo che l'applicazione è stata terminata' - no, non può. Tutti i thread hanno il loro stato impostato in modo che non vengano mai eseguiti di nuovo o, se si esegue su un core diverso da quello che è uscito, il loro processore è stato interrotto per fermarli. Quando tutti i thread si sono fermati, le risorse vengono deallocate. –

6

Ho alcuni loop infinte come posso ottenere il consumo di CPU più basso?

Bloccando il ciclo finché non c'è qualcosa da fare.

Se nella mia applicazione sono presenti più thread e uno di questi è THREAD_PRIORITY_IDLE, interessa anche altri thread?

.. dipende. Probabilmente no, ma se altri thread attendono l'output di questo thread o il rilascio di un lock da esso, gli altri thread vengono effettivamente "trascinati" su THREAD_PRIORITY_IDLE.
Oltre a questa inversione di priorità (che può causare deadlock quando i thread hanno diversi livelli di priorità), gli spinlock, un costrutto di sincronizzazione che normalmente è solo negativo, possono diventare disastrosi.

Problemi correlati