Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Workerthread: Der Diener im Hintergrund

  Alt 13. Jun 2007, 19:17
Ist es nicht so, dass Exceptions innnerhalb von Threads ins Nirvana gehen?
Man könnte diese aber über ein Event an die Applikation weiterreichen.
Delphi-Quellcode:
Procedure TWorkerThread.Run;
// Kleine Hilfsprozedur, die den aktuellen Job ausführt.
Begin
  Try
    If fCurrentJob.UsesCOMObjects and not fCOMInitialized Then Begin
      fCOMInitialized := True;
      CoInitialize(Nil)
    End;
    fCurrentJob.execute(Self);
  Except
     // die Exception wurde nicht innerhalb des Jobs behandelt
     if Assigned(FOnException) then
        // Event auslösen
        FOnException(fCurrentJob, ExceptObject);
  End;
  fCurrentJob.Free;
End;
Man könnte den TNopJob vermeiden, wenn man so ändert:

Delphi-Quellcode:
Procedure TWorkerThread.Execute;
// Arbeitsschleife des Workerthreads. Er wartet, bis die Semaphore aktiv ist.
// Dann wird der nächste Job aus der Jobliste extrahiert und abgearbeitet.
Var
  L: TList;
Begin
  While Not Terminated Do
    If WaitForSingleObject(fSemaphore, INFINITE) = WAIT_OBJECT_0 Then
  Begin
     if Terminated then Exit; // <===== Ausstieg, falls Kill aufgerufen wurde
      L := fJobs.LockList;
      Try
   If l.count > 0 Then
         Begin
     fCurrentJob := TWorkerThreadJob(L[0]);
     l.Delete(0);
   End;
      Finally
   fJobs.UnlockList;
      End;
       If fCurrentJob.Synchronized Then
   Synchronize(Run)
       Else
   Run;
    End;
End;

Procedure TWorkerThread.Kill;
Begin
  ReleaseSemaphore(fSemaphore, 1, Nil) // <=====
  Terminate;
End;
Andreas
  Mit Zitat antworten Zitat