Seltsamer Programmfehler (Delphi schließt sich)
Hallo,
ich habe ein ziemlich nerviges Problem... ich habe während einer VCL Entwicklung festgestellt, dass sich das Programm mitsamt Delphi IDE schließt - ohne jegliche Fehlermeldung. Für dieses Projekt (da hier ein besonderer Wert auf Abwärtskompatibilität gelegt werden muss) nutze ich Delphi 6 und Windows 2000 SP4. Folgenden Quellcode habe ich erzeugen können, der das Problem reproduziert. Es sind viele andere Variationen möglich, aber alle haben sie gemein, dass in einem OnTimer-Ereignis ein Thread aufgerufen wird.
Delphi-Quellcode:
Starte ich die Anwendung außerhalb des Debuggers scheint alles unauffällig zu sein. Betriebssystem und Anwendung laufen stabil.
{ TMySendingThread }
type TMySendingThread = class(TThread) protected procedure Execute; override; end; procedure TMySendingThread.Execute(); begin end; { TForm2 } procedure TForm2.FormCreate(Sender: TObject); begin x := TTimer.Create(Self); x.Interval := 100; // Desto kürzer die Zeit, desto schneller stürzt Delphi ab x.OnTimer := MyTimer; end; procedure TForm2.MyTimer(Sender: TObject); var z: TThread; begin // Dieser Thread bringt Delphi nach mehreren Timer-Ereignissen zum Absturz! // (Obwohl der Thread ja gar nix macht!) // Im Debugger schließen sich die Anwendung UND Delphi einfach so (Delphi 6, Windows 2000 SP4) // Keine Fehler-Meldung und auch Delphi fragt nicht, ob man den Quelltext speichern will etc // Außerhalb des Debuggers gibt es keine Auffälligkeiten. Anwendung und Windows laufen stabil z := TMySendingThread.Create(true); z.FreeOnTerminate := true; z.Resume; end; end. Lediglich Delphi schließt sich (Egal ob der Quelltext gespeichert wurde oder nicht!) einfach so, wenn die Anwendung im Debugger gestartet wird. Tritt das Problem bei neueren Delphi Versionen auch auf? Ist es ein Delphi-Bug? Oder stoße ich durch den Thread im Timer gegen irgendwelche Betriebssystem-Grenzen/Bugs? Über Hinweise wäre ich sehr Dankbar. Gruß blackdrake |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Du erzeugst alle 100 Millisekunden einen neuen Thread? Das ergibt 600 Threads in einer Minute. Ich kann dir zwar nicht erklären, warum das Programm in der IDE abstürzt und ohne IDE nicht. Aber ich kann dir sagen, dass das bestimmt nicht gut ist, was du da machst und mit Sicherheit nicht die Lösung deines Problems.
|
AW: Seltsamer Programmfehler (Delphi schließt sich)
Naja, der wird doch sofort wieder freigegeben, da FreeOnTerminate True ist und im Execute nichts geschieht.
Was ich mir vorstellen könnte ist, dass dies wirklich ein Fehler im Debugger ist. Bei jeder Threaderstellung bekommt der Debugger eine Benachrichtigung und da es irgendwann zuviel wird, kommt der Durcheinander. Wäre eventuell einen QC-Eintrag Wert?! Mit Delphi XE2 funktioniert das übrigens in der IDE ohne Absturz. Grüße |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Zitat:
|
AW: Seltsamer Programmfehler (Delphi schließt sich)
Du könntest auch mal ins OnTerminate deiner Threads Folgendes einfügen:
Delphi-Quellcode:
if Assigned(FatalException) then
ShowException(FatalException as Exception); Mal sehn ob was passiert. |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Und das Thread Object liegt auf dem Stack weil lokal definiert...
Das ist doch nicht mehr gültig wenn die Timer Procedure beendet wird.. Oder? Mavarik |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Zitat:
FreeOnTerminate + Resume ist eine Kombination, bei der Probleme vorprogrammiert sind. Nicht ohne Grund ist Resume mittlerweile als deprecated markiert. Eins der möglichen Probleme: Resume ist noch nicht fertig, wenn der Thread schon fertig ist und freigegeben wird. Rumms... |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Also ich halte das nicht für Blödsinn, denn nichts anderes passiert, wenn man den Thread mit 'CreateSuspended=False' instantiiert: Er wird erst 'Suspended' erzeugt (in jedem Fall) und im AfterConstruction ggfs. per 'Resume' aufgeweckt.
Die Resume-Methode ist deprecated, weil viele Programmierer damit Threads zwischendurch anhalten bzw. wieder weiterlaufen lassen. Und DAS ist eine schlechte Idee. Edit:... oh, es ist doch nicht geschickt, so wie es umgesetzt ist, ich bezweifle aber, das das Probleme bereitet. Ich mache das mit dem Initialisieren immer im abgeleiteten Konstruktor:
Delphi-Quellcode:
und das ist so überflüssig (aber deklarativ).
Constructor TMyThread.Create;
Begin inherited Create(True); InitializeMyThreadStuff(); Resume; End; |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Zitat:
Der Thread wird doch sowieso immer erst nach der Create-Methode gestartet. (wenn man es nicht suspended startet) |
AW: Seltsamer Programmfehler (Delphi schließt sich)
Hi,
Eben. Ich schrieb ja, ... Zitat:
Und, ich muss zu meiner Schande gestehen, das ich eben erst (durch Studium des Classes-Quellcodes) entdeckt habe, das meine Vorgehensweise gut gedacht aber vollkommen überflüssig ist. Los, nun hack noch weiterauf meinem Unvermögen rum. Es regnet sowieso. Das Wochenende ist versaut. Muhuuuhhhuuuu. :cry: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz