Avatar billede f2f4 Novice
08. februar 2010 - 14:29 Der er 1 løsning

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
Avatar billede f2f4 Novice
10. februar 2010 - 11:25 #1
Problem løst ved selv at oprette en event dertil:
::
  TExceptionEvent = procedure (E: Exception) of Object;
::
    FOnExceptionEvent: TExceptionEvent;
::
procedure DoOnException;
begin
  OnException(FException);
end;
::
procedure HandleException;
begin
  FException := Exception(ExceptObject);
  if Assigned(OnException) then
    Synchronize(DoOnException);
end;
::
procedure Execute;
begin
  try
    ::
  except
    HandleException;
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester