Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#23

Re: Threads werden automatisch beendet

  Alt 20. Aug 2005, 08:24
Meine Threads sehen i.a. immer so aus ('Workerthreads'):
Delphi-Quellcode:
Procedure TMyThread.Execute;
Begin
  While Not Terminated do
    If WaitForSingleObject (hndSempahore, dwMyTimeout) = WAIT_OBJECT_0 Then
      // führe den Auftrag aus
    else
      // Timeout Verarbeitung
End;
Das 'hndSemaphore' ist ein mit 'CreateSemaphore' erzeugtes Handle auf eine Semaphore. Das ist sowas wie ein Zähler.
WaitForSingleObject wartet solange, bis die Semamphore (der Zähler) > 0 ist. Mit 'ReleaseSemaphore' 'addiert' man etwas zur Semaphore und kann so dem Thread sagen, das er loslegen soll. Das Ganze ist absolut Threadsicher.

Ich würde einen Thread schreiben, der im Hintergrund Daten einliest und in einen Buffer schreibt (z.B. einem FIFO oder Queue). Nach dem Schreiben eines Datenpaketes, oder wenn der Buffer halbvoll ist oder so, wird ein zweiter Thread angestossen, der die Daten aus dem Buffer ausliest und weiterverarbeitet (z.B. zeichnet). Dieser zweite Thread wird natürlich auch über eine Semaphore angestossen.

Wenn ich die Weiterverarbeitung nur mit einem Zeitgeber (threadgesteuert oder als Timer) mache, kann es passieren, das der Buffer zu voll wird.

Der Vorteil dieser Methode ggü einem einfachen Suspend/Resume ist die mögliche Behandung eines Timeouts. Ich finde es auch nicht ästhetisch, wenn ein Thread sich per Suspend selbst schlafen legt. Aber das ist Geschmackssache.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat