AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Seltsamer Programmfehler (Delphi schließt sich)
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsamer Programmfehler (Delphi schließt sich)

Ein Thema von blackdrake · begonnen am 4. Jan 2012 · letzter Beitrag vom 7. Jan 2012
Antwort Antwort
Seite 1 von 2  1 2      
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Seltsamer Programmfehler (Delphi schließt sich)

  Alt 4. Jan 2012, 08:02
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:
{ 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.
Starte ich die Anwendung außerhalb des Debuggers scheint alles unauffällig zu sein. Betriebssystem und Anwendung laufen stabil.

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
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 4. Jan 2012, 09:08
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dawn87

Registriert seit: 15. Feb 2007
Ort: Lüdenscheid
189 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 4. Jan 2012, 09:52
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

Geändert von Dawn87 ( 4. Jan 2012 um 09:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 4. Jan 2012, 09:59
Naja, der wird doch sofort wieder freigegeben, da FreeOnTerminate True ist und im Execute nichts geschieht.
Trotzdem muss Windows für jeden Thread 2 MB Speicher für den Stack des Threads im Adressraum des Prozesses anlegen für jeden neu erzeugten Thread. Auch wenn kein produktiver Code ausgeführt wird, hechelt Windows da ganz schön hinter her. Und ich gehe mal davon aus, dass irgendwann noch Code in die Execute Methode der Thread-Klasse ausgeführt werden soll. Oder soll hier ein Bug in der IDE aufgedeckt werden, der eigentlich so nie zum Tragen kommt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#5

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 4. Jan 2012, 11:01
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 7. Jan 2012, 04:50
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.590 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 7. Jan 2012, 08:10
Delphi-Quellcode:
  z := TMySendingThread.Create(true);
  z.FreeOnTerminate := true;
  z.Resume;
Lass den Blödsinn mit suspended erzeugen und Resume, dann wird es wahrscheinlich auch keine Probleme mehr geben...

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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#8

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 7. Jan 2012, 09:18
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:
Constructor TMyThread.Create;
Begin
  inherited Create(True);
  InitializeMyThreadStuff();
  Resume;
End;
und das ist so überflüssig (aber deklarativ).

Geändert von Furtbichler ( 7. Jan 2012 um 09:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#9

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 7. Jan 2012, 09:23
Ich mache das mit dem Initialisieren immer im abgeleiteten Konstruktor:
Delphi-Quellcode:
Constructor TMyThread.Create;
Begin
  inherited Create(True);
  InitializeMyThreadStuff();
  Resume;
End;
Wozu das Resume?
Der Thread wird doch sowieso immer erst nach der Create-Methode gestartet. (wenn man es nicht suspended startet)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 7. Jan 2012 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Seltsamer Programmfehler (Delphi schließt sich)

  Alt 7. Jan 2012, 09:36
Hi,
Eben. Ich schrieb ja, ...
...das ist so überflüssig (aber deklarativ).
Mit "deklarativ" meine ich, das der Code beschreibt, was (sowieso im Hintergrund) geschieht.

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.

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 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