Gut, in meinen Fällen bewegt sich die Wartezeit selten über 1000ms. Das ist in der Tat ein valides Problem. Aber auch "schmutzig" lösbar:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
timer: Integer;
begin
repeat
// Zeug
timer := 0;
repeat
Sleep(100);
inc(timer, 100);
until (timer >= 1000) or Terminated;
until Terminated;
end;
Nicht schön, aber möglich.
In meinem letzten Thread-intensiven Projekt habe ich es noch ein wenig anders: Es gibt einen Haupt-Workerthread, dessen Aufgabe es ist Jobs abzuarbeiten (Einträge in eine
DB machen). Die Jobs fallen zyklisch an, wobei es mehrere verschiedene Zyklus-Gruppen gibt, die alle unterschiedliche Intervalle haben. Für jede Gruppe gibt es daher einen weiteren Thread, der einfach nur seine Wartezeit durch wartet, und dann dem Job-Thread signalisiert einen Job zu machen.
Delphi-Quellcode:
// "Timer-Thread"
proceudre TJobGroup.Execute;
begin
repeat
while ((GetTickCount-LastJobFired) < Interval) and (not Terminated) do
Sleep(0);
if not Terminated then
SignalJob();
LastJobFired := GetTickCount;
until Terminated;
end;
// Job-Thread
procedure TJobs.Execute;
begin
repeat
while JobList.Count > 0 do
begin
DoStuff(JobList[0]);
JobList.Delete(0);
end;
Sleep(0);
until Terminated;
end;
(Das Sleep(0) sorgt dafür, dass der Thread immer mal wieder seine Time-Slices abgibt, und damit nicht immer maximale CPU Auslastung verursacht.)
Die JobList Zugriffe müssen natürlich durch eine CriticalSection gesichert werden. Aber das ist schon für ein recht großes Projekt, für ein Töölchen so nebenbei würde ich das so auch nicht machen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)