Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm hängt sich im Create weg (es passiert nix mehr) (https://www.delphipraxis.net/205852-programm-haengt-sich-im-create-weg-es-passiert-nix-mehr.html)

Maliko 23. Okt 2020 11:48

Programm hängt sich im Create weg (es passiert nix mehr)
 
Moin,

ich hab momentan ein sehr merkwürdiges Problem. Und zwar habe ich eine Form, bei der das Programm sich jedes mal Weghängt, wenn ich versuche diese zu öffnen. Das Problem ist, dass es nicht crashed oder so sondern dass einfach gar nix mehr passiert. Das Fenster friert einfach ein und wenn ich zu Delphi wechsle, bekomme ich das Fenster auch nicht mehr in den Fordergrund (so wie normalerweise wenn ein Breakpoint aktiv ist).

Merkwürdigerweise handelt es sich bei der Codezeile die dafür sorgt um den Constructor (TUnit.Create(AOwner)). Ich hab mal versucht durch die VCL-Daten zu debuggen und bin letztenendes bei der Funktion InternalReadComponentRes (welche in der Funktion InitComponent als Unterfunktion von InitInheritedComponent aufgerufen wird) in der System.Classes gelandet, wo er scheinbar in eine Endlosschleife läuft (zumindest ruft er solange ich F7 drücke die Funktion immer wieder aufs neue auf).

Hat vielleicht irgendjemand eine Ahnung was da los ist? Die Form wird zentral von einer bestimmten Unit created und dann im gesamten Programm verwendet. Rufe ich die Form direkt über die Unit auf, in welcher sich der Creationbefehl befindet auf (also über Self.OeffneForm), dann funktioniert es einwandfrei. Rufe ich die Funktion aber ich var.OeffneForm auf, dann passiert das oben geschilderte.

Ich bin da grad echt etwas überfragt, weil dass ja scheinbar auch nicht mit meinem Code zusammenhängt, sondern in den VCL-Basisdateien passiert.

Danke euch schon einmal im Vorraus
Maliko

philipp.hofmann 23. Okt 2020 11:58

AW: Programm hängt sich im Create weg (es passiert nix mehr)
 
Alles in der Methode auskommentieren, dann sollte es noch funktionieren. Dann stückweise wieder einkommentieren und schauen, wann es anfängt zu hängen.

stahli 23. Okt 2020 12:00

AW: Programm hängt sich im Create weg (es passiert nix mehr)
 
Bitte konkretisiere das Problem.

Hängt sich Delphi auf oder das Programm?
Zur Designtime? Im Debugmodus? Zur Laufzeit ohne Debugging?
Werden eigene Komponenten genutzt oder Komponenten von Drittanbietern oder nur Delphi-Komponenten?

Welche Delphi-Version?

Das wird die Problematik vielleicht schon etwas besser eingrenzen.

Maliko 23. Okt 2020 12:03

AW: Programm hängt sich im Create weg (es passiert nix mehr)
 
Ich hab den Fehler gefunden. Der Fehler tritt scheinbar auf, wenn man versucht die Form im Multithreading zu öffnen. Wir haben eine Komponente namens TWarten, welche die Funktion über einen seperaten Thread aufruft. Wenn ich die Funktion direkt sequenziell aufrufe, dann funktioniert es. Es scheint also mit dem Thread zusammenzuhängen. Ich muss mich Montag mal mit dem Kollegen zusammensetzen, der die Klasse geschrieben hat.

Achso, das passiert immer. Sowohl im Debug als auch zur normalen Laufzeit.

sakura 23. Okt 2020 12:13

AW: Programm hängt sich im Create weg (es passiert nix mehr)
 
Korrekt, die VCL-Komponenten selbst sind nicht thread-safe und müssen immer über den Hauptthread der Anwendung angesprochen/erstellt/etc. werden.

...:cat:...

himitsu 23. Okt 2020 12:18

AW: Programm hängt sich im Create weg (es passiert nix mehr)
 
[edit]
OK, das mit dem Thread war natürlich eine etwas blöde Idee.
[/edit]


Es hängt also beil Lagen der DFM.

Da gibt es einmal InternalReadComponentRes mit TReader, welche die DFM einlesen, und das der Reihe nach und es gibt keine Wiederholungen.
Aber da drin werden auch Komponenten erstellt und Property gelesen geschrieben, also Contrucoren und Setter aufgerufen und dort wird es wohl irgendwo hängen bleiben.


Das Selbe, was vorhin mit dem Code vorgeschlagen wurde, kann man auch mit der DFM machen, also Komponenten/Property entfernen und schauen wann es wieder geht.
Im Delphi/FormDesigner oder mit einem Texteditor.

Dank SVN/Git/... lässt sich auch super einfach Zeugs entfernen und wiederherstellen.



PS: Wir haben inzwischen viele derartige Threaddinge wieder entfernt, also wo etwas im Thread läuft, aber der Mainthread darauf wartet ... da ist sowas eh nutzlos.

Wenn es sein muß, dann kann man im Thread auch eine NonVCL-Warteform anzeigen oder dort auf Tasten warten, um damit den Fortschritt anzuzeigen oder ein Abbrechen anzustoßen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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