Exceptions i en tråd
Er der mon nogle der kan guide mig lidt på vej med ovenstående.Jeg har en unit med en tråd (TDownloadThread) klassen og en kaldeklasse (TDownloadThreadRunner) til at kalde tråden. Der finder kun én tråd, og denne styrer en downloadprocs af xml filer via nettet. Jeg ønsker at kunne fange en Exception hos vedkommende der bruger min TDownloadThreadRunner men kan ikke rigtig få det til at spille!?
Lidt psudo kode:
::
procedure TDownloadThreadRunner.Start;
begin
if FThreadRunning then
begin
FDownloadThread.Free;
raise ThreadRunningException.Create('Thread allready running');
end;
if Assigned(FOnProcessStarted) then
FOnProcessStarted(self);
FDownloadThread := TDownloadThread.Create(FDownloadFile, FDownloadToFile, FThreadPriority);
FDownloadThread.OnTerminate := HandleThreadTermination;
FDownloadThread.Status := FOnStatus;
FProcessingComplete:= true;
end;
procedure TDownloadThreadRunner.HandleThreadTermination(Sender: TObject);
begin
FThreadRunning:= false;
if FDownloadThread.FError then
FCompleteWithoutErrors:= true;
if Assigned(FOnProcessTerminated) then
begin
FOnProcessTerminated(FDownloadThread.FException); //OBS
end;
end;
::
procedure TDownloadThread.HandleException;
begin
FException := Exception(ExceptObject);
FError:= true;
end;
procedure TDownloadThread.Execute;
var OnlineControl: TOnlineCtrl;
HTTPResult: string;
begin
OnlineControl := TOnlineCtrl.Create;
if OnlineControl.Dial(false) = dr_Error then
begin
OnlineControl.Free;
raise ConnectionErrorException.Create('Error while connecting to the Internet');
end
else
begin
try
try
HTTPResult := DownloadFile(FFile);
except
HandleException;
end;
finally
OnlineControl.HangUp(false);
OnlineControl.Free;
end;
if not(FError) then
SaveFile(ToFile, HTTPResult);
end;
end;
Mit kaldende program:
::
DownloadThreadRunner := TDownloadThreadRunner.Create;
DownloadThreadRunner.DownloadFile := 'http://www. ...';
DownloadThreadRunner.DownloadToFile := 'c:\...';
DownloadThreadRunner.ThreadTerminated := Terminate;
DownloadThreadRunner.OnStatus := Status; //Dette virker fint, jeg har en statusbar på min form
DownloadThreadRunner.Start;
::
procedure Terminate(Sender: TObject);
var E: Exception;
begin
if DownloadThreadRunner.CompleteWithoutErrors then //virker fint
if ((Sender <> nil) and (Sender is Exception)) then //virker ikke
::
end;
I Delphi's hjælp fremgår det ved OnTerminate (TThread): Occurs after the thread's Execute method has returned and before the thread is destroyed.
Min idé er at tråden ved fejl kaster en Exception, som jeg håber at kunne fange i OnTerminate ... men det virker ikke!?
Kan nogle hjælpe mig på vej?
Mvh. Morten
