Thread-Exceptions ausgeben
Delphi-Quellcode:
type
TAnalyseThread =
class(TThread)
protected
procedure DoTerminate;
override;
// oder z.B. als MyOnTerminate über OnTerminate
end;
procedure TAnalyseThread.DoTerminate;
begin
if Assigned(FatalException)
then begin // FatalException ist ausschließlich im OnTerminate/DoTerminate verfügbar
var S :=
Exception(FatalException).
Message;
// Exception oder Message kopieren/klonen, denn später im Queue ist sie schon weg.
TThread.Queue(
nil,
procedure
begin
MessageBox(Application.MainFormHandle, PChar(S), '
Thread-Error', MB_OK
or MB_ICONERROR);
end);
end;
inherited;
end;
oder über das Event
Delphi-Quellcode:
constructor TAnalyseThread.Create(CreateSuspended: Boolean);
begin
OnTerminate := MyOnTerminate;
inherited;
end;
oder
Delphi-Quellcode:
procedure TAnalyseThread.Execute;
begin
try
...
// hier dazwischen alles erstellen/freigeben ... nichts im Create/Destroy
except
on E:
Exception do begin
var S := E.
Message;
// Exception oder Message kopieren/klonen, denn später im Queue ist sie schon weg.
Queue(
procedure
begin
MessageBox(Application.MainFormHandle, PChar(S), '
Thread-Error', MB_OK
or MB_ICONERROR);
end);
end;
end;
end;
Und es ist absichtlich Queue anstatt Synchronize, damit ein Deadlock beim Freigeben verhindert wird.
z.B. Thread wartet auf MainThread, aber MainThread wartet im Thread.Free auf das Thread-Ende.
PS:
Delphi-Quellcode:
type
TAnalyseThread = class(TThread)
public
OnReady: TNotifyEvent;
constructor Create(OnReady: TNotifyEvent=nil);
end;
constructor TAnalyseThread.Create(OnReady: TNotifyEvent);
begin
inherited Create(not Assigned(OnReady));
Self.OnReady := OnReady;
FreeOnTerminate := False;
end;
und dann anstatt
Zitat:
Delphi-Quellcode:
if Assigned(AnalyseThread) then
begin
AnalyseThread.Terminate;
FreeAndNil(AnalyseThread);
end;
AnalyseThread := TAnalyseThread.Create(True);
if Assigned(AnalyseThread) then
begin
AnalyseThread.OnReady := OnAnalyseReady;
AnalyseThread.Start;
end;
nur noch ein
Delphi-Quellcode:
FreeAndNil(AnalyseThread);
AnalyseThread := TAnalyseThread.Create(OnAnalyseReady);