![]() |
Fragen zum TThread, Programm absturzsicher?
Hallo @ all,
Ich hab einige Fragen zu der Komponente TThread. Ich möchte für ein Projekt, bei dem wichtige Daten erzeugt werden, soll Absturz sicher gemacht werden. Dazu möchte ich das Programm wie folgt aufbauen: Der durch den Start erzeugte Thread soll als so eine Art Sicherheitsthread dienen, der rein nur die Daten für mich sichert, die erzeugt werden. Damit möchte ich verhindern (was bei uns schonmal in der Firma passiert ist, dass nach 2h Computerarbeitszeit und einem Programmabsturz sämtliche Daten verloren gehen). Dieser Sicherheitsthread soll den eigentlichen Arbeitsthread erzeugen und in dem wird eigentlich sämtliche Arbeit erledigt. Jetzt meine Frage: Wenn ich eine Exception in dem Arbeitsthread bekomme, führt das auch zu einem kompletten Programmabsturz oder wird dann nur der Arbeitsthread tot gemacht oder führt es auch zu einem kompletten Programmabsturz? Wenn es einen kompletten Programmabsturz gibt, kann man dies auf irgendeine Art verhindern, so dass der Sicherheitsthread weiterlaufen kann? Vielen Dank BAMatze |
Re: Fragen zum TThread, Programm absturzsicher?
Ein kompletter Programmabsturz entsteht wenn im Hauptthread (dort, wo das Programm startet) eine Exception nicht mit try..Except abgefangen wird. Wird ein einem Kindthread eine Excepütion nicht abgefangen beendet das nur diesen Thread.
Ich glaube du solltest dir eher Gedanken über Exceptionbehandlung machen und dann über Threads nachdenken. |
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
Danke dir für die schnelle Antwort @ sirius. |
Re: Fragen zum TThread, Programm absturzsicher?
Ist bei der Kamera vielleicht eine dll dabei, mit der Du aus Delphi zugreifen kannst? Mit ActivX-Controls ist das so eine Sache...
Grüße, Messie |
Re: Fragen zum TThread, Programm absturzsicher?
Mir fällt dazu nicht viel ein. Wenn sogar der ganze Computer abstürzt. Da muss ja einiges falsch sein. Das sieht ja schon mehr nach Treiberproblemen aus.
Und sichtbare Controls sollte man immer im Hauptthread lassen, deswegen sehe ich keine Chance das ActiveX-Control in einen anderen Thread zu legen. |
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
@ sirius also der gesamte Rechner stürzt nicht ab, das hab ich in der Entwicklungszeit eigentlich gut unter Kontrolle bekommen, ist allerdings nachher, wenn ich (wegen Firmenblindheit für die eigene Arbeit) später nicht mehr selber dran sitze, nicht ausgeschlossen, dass es nochmal passiert. Aber was derzeit immer wieder passiert, sind Exceptions (trotz try und except) und damit verbundene Datenverluste. Dies möchte ich mit der Methode eigentlich minimieren. (Lasse derzeit schon mehrere Sicherungen mitlaufen z.B. erstellen einer Tempfile und protokollieren in dieser). BAMatze |
Re: Fragen zum TThread, Programm absturzsicher?
Wenn es in Delphi angeblich nicht geht, dann könntest du dir eventuell eine DLL in C oder VB erstellen, welche auf die Kamera zugreift und dein Delphi-Programm greift über diese DLL zu.
die Möglichkein die Kamera in einem extra Programm laufen zu lassen bestünde auch noch ... beide Programme könnten dann via ![]() ![]() |
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
Was ich an deiner Lösung nicht verstanden hab ist, wie mein Problem mit einer DLL in C oder VB gelöst wird, vieleicht kannst du da noch etwas genauer werden. Denn das Problem, dass die Delphi-Komponenten anscheinend nicht die geeignete Schnittstelle haben, um das Live-Bild der Kamera darzustellen bleibt doch oder hab ich da jetzt einen Denk-Fehler? BAMatze |
Re: Fragen zum TThread, Programm absturzsicher?
Warum sollte das Delphi nicht anzeigen können?
|
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
Zumindest in ältere Delphis stürtzt das Programm ab. |
Re: Fragen zum TThread, Programm absturzsicher?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
Also dein Delphiprogramm sagt z.B. der in C geschriebenen DLL was es haben möchte, diese holt beispielsweise das Bild, wandelt es notfalls in ein für Delphi verständliches Format um und gibt es dann an dein Programm weiter. Aber vermutlich am Besten wäre es rauszufinden warum das nicht direkt in Delphi gehen soll und den Zugriff womöglich doch noch hinzubekommen. |
Re: Fragen zum TThread, Programm absturzsicher?
Also da steht, man sollte es nicht in Delphi programmieren, weil:
"Es müssen eigene Header Dateien erstellt werden." Ist ja schön, dass auf das ActiveX-Control verwiesen wird, aber wenn das fehlerhaft ist, muss man eben ein Schritt zurück gehen. Also wenn das diese Community hier nicht schafft.... Wie sehen denn die C-Header aus? |
Re: Fragen zum TThread, Programm absturzsicher?
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
|
Re: Fragen zum TThread, Programm absturzsicher?
Hallo,
schau mal bitte bei Dr. Bob nach: ![]() Auf der Seite bekommst Du ein Tool, das aus C-Headerdateien Pascal/Delphi-Units macht. Eventuell reicht das ja schon für Deine Aufgabe. |
Re: Fragen zum TThread, Programm absturzsicher?
Hmm bin jetzt irritiert, da bei einem Versuch auch der Hauptthread gecrasht ist, obwohl eine Exception nur im Nebenthread aufgetreten ist. Also gehe ich jetzt mal davon aus, dass dies wie meine erste Frage implizierte wohl doch nicht funktioniert. Oder mache ich da etwas falsch oder habe ich was übersehen?
|
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
Versuchs mit try-except in Deinem Thread die Exceptions abzufangen, das läßt Deine Anwendung am Leben ;) |
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
|
Re: Fragen zum TThread, Programm absturzsicher?
Hab mal eben getestet:
D2: Fehlermeldung, Programm beendet D5: Programm beendet sich ohne Fehlermeldung :shock: BDS 10: Nix tut sich @TE: Einfach mal in nem neuem Projekt testen, was Dein Delphi so an Verhalten compiliert. Edit: Find ich schon witzig, das in zB BDS 10 die Exception einfach so per Standard verschluckt werden.. |
Re: Fragen zum TThread, Programm absturzsicher?
in D7 dürfte es auch nicht abstürzen
und so einfach verschlugt wird die Exception nicht wirklich {} ist in D2009 drin und gab's in D7 noch nicht
Delphi-Quellcode:
function ThreadProc(Thread: TThread): Integer;
var FreeThread: Boolean; begin {}InternalCurrentThread := Thread; {}if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem); try if not Thread.Terminated then try Thread.Execute; except Thread.FFatalException := AcquireExceptionObject; end; finally FreeThread := Thread.FFreeOnTerminate; Result := Thread.FReturnValue; Thread.DoTerminate; Thread.FFinished := True; SignalSyncEvent; if FreeThread then Thread.Free; EndThread(Result); end; end; |
Re: Fragen zum TThread, Programm absturzsicher?
Ok, ich habe es mal getestet (in D7)
|
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 |
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.
|
Re: Fragen zum TThread, Programm absturzsicher?
Zitat:
|
Re: Fragen zum TThread, Programm absturzsicher?
siehe
![]() k.A. ob's funktioniert
Delphi-Quellcode:
hier hab ich mal alles verpackt und versucht die Finalisierung von Application nachzubauen:
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.
Delphi-Quellcode:
aber eigentlich die die Nachrichtenbearbeitung des Hauptthreads (im .Run) auch per Try-Except abgesichert.
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr. |
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