Różne odpowiedzi sugerują, że spanie wewnątrz wątku to zły pomysł, na przykład: Avoid sleep. Dlaczego dokładnie? Często podawanym powodem jest to, że trudno jest z wdziękiem wyjść z wątku (sygnalizując mu zakończenie), jeśli śpi.Alternatywa do spania wewnątrz wątku
Załóżmy, że chcę okresowo sprawdzać, czy nie ma nowych plików w folderze sieciowym, może raz na 10 sekund. Wydaje się to idealne dla wątku z priorytetem ustawionym na niski (lub najniższy), ponieważ nie chcę, aby potencjalnie czasochłonne operacje we/wy pliku wpływały na mój główny wątek.
Jakie są alternatywy? Kod podany jest w Delphi ale mają również zastosowanie do każdej wielowątkowych aplikacji:
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;
Drobna modyfikacja może być:
// Rest a little before spinning around again
nSleepCounter := 0;
while (not Terminated) and (nSleepCounter < 500) do
begin
Sleep(TwentyMilliseconds);
Inc(nSleepCounter);
end;
ale to nadal wiąże się z uśpienia ...
Spanie w jednym wątku może również być niebezpieczne i prowadzić do nieokreślonego zachowania podczas używania wielowątkowości. – ITguy
Lepszą alternatywą jest oczekiwanie na zdarzenie sygnalizacyjne dla tego samego limitu czasu; jeśli zdarzenie zostanie zasygnalizowane, natychmiast opuścisz wątek, jeśli masz czas, pozostaniesz w pętli 'while'. – kludg
@ Sleeping Sleeping nie ma nieodłącznego zagrożenia i nie prowadzi do niezdefiniowanych zachowań. –