Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#26

AW: Thread mit timer gestartet

  Alt 27. Okt 2014, 18:04
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)

Geändert von Medium (27. Okt 2014 um 18:08 Uhr)
  Mit Zitat antworten Zitat