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;