Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fragen zum TThread, Programm absturzsicher? (https://www.delphipraxis.net/128789-fragen-zum-tthread-programm-absturzsicher.html)

sirius 6. Feb 2009 15:18

Re: Fragen zum TThread, Programm absturzsicher?
 
Ok, ich habe es mal getestet (in D7)
  • Direkt über die WinAPI bleibt das komplette Programm stehen (tut nix mehr aber schließt sich auch nicht), wenn in einem Thread eine Exception auftritt:
    Delphi-Quellcode:
    function ThreadFunc(lparam:Integer):Integer; stdcall;
    begin
      raiseException(0,0,0,nil);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var temp:Cardinal;
    begin
      createthread(nil,0,@ThreadFunc,nil,0,temp);
    end;
  • Bei BeginThread legt Delphi noch ein Exceptionframe auf die Funktion _ExceptionHandler der eine schöne Meldung ausgibt und dann das Programm beendet
  • TThread hat (was mir in Erinnerung war und wie himitsu sagt) ein try..except um die Methode Execute. Die Exception wird dann in der Eigenschaft FatalException gespeichert und kann abgerufen werden. Egal was gemacht wird, der Thread beendet sich und alles andere läuft normal weiter. Kein Meldungsfenster, kein nix.

BAMatze 8. Feb 2009 19:37

Re: Fragen zum TThread, Programm absturzsicher?
 
@ sirius,

also erstmal danke für deine Mühen, aber kannst du da nochmal etwas genauer drauf eingehen? Ich hab das nicht wirklich verstanden, wie ich das Hauptthread absturzsicher mache. Könntest das eventuell nochmal etwas genauer erklären? also bei meinem Rad Studio 2006 ist bisher immer beide Threads durchgebrannt bei einer Exception. Hab noch keinen Weg gefunden, wie ich das verhindern kann. Dies scheint dir ja gelungen zu sein.

Auch Danke an euch andere.
BAMatze

himitsu 8. Feb 2009 20:18

Re: Fragen zum TThread, Programm absturzsicher?
 
nunja, am einfachsten scheint es zu sein, wenn du alle Hauptprozeduren deiner Thread und des Hauptthreads in Try Except verpackst.

BAMatze 8. Feb 2009 20:26

Re: Fragen zum TThread, Programm absturzsicher?
 
Zitat:

Zitat von himitsu
nunja, am einfachsten scheint es zu sein, wenn du alle Hauptprozeduren deiner Thread und des Hauptthreads in Try Except verpackst.

Ja dies scheint auch seine Vorteile zu haben, da man dann in den Except-Teil gleich eine Fehlermeldung übergeben kann, aber würde gern mal wissen, wie Sirius das gemacht hat. Hat auch einen Hintergrund, ein großes Programm meines Vorgängers, hat trotz try und Except regelmäßige Abstürze und sämtliche Daten gehen verloren (habe ich im Einleitungsteil dieses Threats schonmal beschrieben). Möchte dies bei meinem Programm vermeiden. Deswegen möchte ich das mal nachvollziehen, was sirius da gemacht hat, damit ich mir die beste Variante oder eine Kombination machen kann.

himitsu 8. Feb 2009 21:00

Re: Fragen zum TThread, Programm absturzsicher?
 
siehe Beitrag #20, da bemerkt man, daß Delphi bei TThread die Thread-Prozedur (.Execute) schon mit einem Try-Except-Block absichert (zumindestens in "neueren" Delphiversionen)

k.A. ob's funktioniert
Delphi-Quellcode:
Program MyProgram;

Uses SysUtils, Forms, Unit1;

Var doRestart: Boolean;

Begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Repeat
    doRestart := False;
    Try
      Application.Run;
    Except
      doRestart := True;
    End;
  Until doRestart and not Application.Terminated;
End.
hier hab ich mal alles verpackt und versucht die Finalisierung von Application nachzubauen:
Delphi-Quellcode:
Uses SysUtils, Classes, Forms, Unit1;

Function FindGlobalComponent(Const Name: String): TComponent;
  Var i: Integer;

  Begin
    For i := 0 to Screen.FormCount - 1 do Begin
      Result := Screen.Forms[i];
      If not (csInline in Result.ComponentState) and
          (CompareText(Name, Result.Name) = 0) Then Exit;
    End;
    For i := 0 to Screen.DataModuleCount - 1 do Begin
      Result := Screen.DataModules[i];
      If CompareText(Name, Result.Name) = 0 Then Exit;
    End;
    Result := nil;
  End;

Var doRestart: Boolean;

Begin
  Repeat
    doRestart := False;
    Try
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    Except
      doRestart := True;
      Try
        If (Application <> nil) and (Application.Handle <> 0) Then Begin
          Application.Minimize;
          Application.ShowHint := False;
          Application.Destroying;
          Application.DestroyComponents;
        End;
        // If HintDoneEvent <> 0 Then CloseHandle(HintDoneEvent);
        UnregisterFindGlobalComponentProc(FindGlobalComponent);
      Except
      End;
    End;
  Until doRestart and not Application.Terminated;
End.
aber eigentlich die die Nachrichtenbearbeitung des Hauptthreads (im .Run) auch per Try-Except abgesichert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz