さまざまな答えは、スレッド内で眠ることは悪い考えであることを示唆しています(例:Avoid sleep)。なぜ正確に? 1つの理由は、スレッドがスリープしている場合にスレッドを正常に終了させるのが難しいことです(終了するように通知することによって)。スレッド内で寝る代わりに
たとえば、ネットワークフォルダ内の新しいファイルを定期的に確認する場合は、10秒に1回とします。これは、潜在的に時間のかかるファイルI/Oがメインスレッドに影響しないようにするため、優先度が低い(または最低の)スレッドには最適です。
代替手段はありますか?コードは、Delphiで与えられているが、任意のマルチスレッドアプリケーションにも同様に適用されます:
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;
マイナーな変更は次のようになります。
// Rest a little before spinning around again
nSleepCounter := 0;
while (not Terminated) and (nSleepCounter < 500) do
begin
Sleep(TwentyMilliseconds);
Inc(nSleepCounter);
end;
が、これはまだ睡眠を必要とする...
マルチスレッドを使用すると、1つのスレッドでスリープ状態になると危険であり、未定義の動作につながる可能性があります。 – ITguy
より良い方法は、同じタイムアウトの信号イベントを待つことです。イベントが通知された場合はすぐにスレッドを終了し、タイムアウトがあれば 'while'ループに留まります。 – kludg
@ITguy Sleepingは本質的な危険性がなく、未定義の動作につながることはありません –