Varie risposte suggeriscono che è una cattiva idea dormire in una discussione, ad esempio: Avoid sleep. Perché esattamente? Una ragione spesso data è che è difficile uscire con grazia dal thread (segnalandolo per terminarlo) se sta dormendo.Alternativa per dormire all'interno di una discussione
Diciamo che volevo controllare periodicamente i nuovi file in una cartella di rete, forse una volta ogni 10 secondi. Questo sembra perfetto per un thread con la priorità impostata su basso (o più basso) perché non voglio che l'I/O del file potenzialmente dispendioso possa influire sul thread principale.
Quali sono le alternative? Codice è fornito in Delphi, ma si applica anche a qualsiasi applicazione multi-threaded:
procedure TNetFilesThrd.Execute();
begin
try
while (not Terminated) do
begin
// Check for new files
// ...
// Rest a little before spinning around again
if (not Terminated) then
Sleep(TenSeconds);
end;
finally
// Terminated (or exception) so free all resources...
end;
end;
Una modifica minore può essere:
// Rest a little before spinning around again
nSleepCounter := 0;
while (not Terminated) and (nSleepCounter < 500) do
begin
Sleep(TwentyMilliseconds);
Inc(nSleepCounter);
end;
ma ciò comporta ancora un sonno ...
Dormire in un thread può anche essere pericoloso e causare un comportamento indefinito quando si utilizza il multithreading. – ITguy
L'alternativa migliore è aspettare un evento di segnale per lo stesso timeout; se l'evento è segnalato, si esce immediatamente dal thread, se si ha il timeout si rimane nel ciclo 'while'. – kludg
@ITguy Il sonno non ha pericoli intrinseci e non porta a comportamento non definito –