Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung (https://www.delphipraxis.net/212330-d11-programm-haengt-zieht-25-cpu-bei-ui-aktualisierung.html)

stalkingwolf 26. Jan 2023 10:03

D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
ich habe ein etwas merkwürdiges Verhalten eines Programmes.
Wir haben diverse Programme von D6 auf 11 portiert was auch ganz gut funktioniert hat.
Nun habe ich ein Programm was sich merkwürdig verhält wenn es die UI aktualisieren soll.
Z.b Progressbar +1 oder TLabel.caption setzen, hängt das Programm mit einer CPU Auslastung von 25% ( ein Kern ).
Minimiere ich das Programm und maximiere das Programm, dann läuft es weiter.

Das Problem habe ich nur auf ein paar Kunden PCs (Windows 10). Leider auf einem bei uns in der Firma. Damit ist das debuggen extrem schwer.
Ich habe das Projekt schon komplett neu erstellt. Keine Änderung. Da es um relativ viele Units gibt welche untereinander verknüpft sind, ist es auch schwer Teile zu isolieren. Ich habe aber auch aktuell keine Idee wonach ich gezielt suchen soll.

auf Stackoverflow habe ich https://www.delphitools.info/downloa...ler-changelog/ gefunden.
Leider startet es unsere Programme nicht bzw. gibt eine Zugriffsverletzung.

Jemand hier eine Idee oder Ansatz wie ich das lokalisieren kann.

himitsu 26. Jan 2023 10:27

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Erstmal, bezüglich Debuggen von GUI-Sachen, am besten mit dem RemoteDebugger, von einem anderen PC aus.

Ansonsten auch mal mit einem Profiling Tool, ala AQTime, schauen wo die CPU-Zeit drauf geht.

Sinspin 26. Jan 2023 10:28

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Hallo,

Das klingt als wenn sich Handler für Window Botschaften gegenseitig fertig machen.
Visuell sind Delphi Komponenten im Einsatz?

Da sind ettliche Delphi Generationen dazwischen.
In alten Delphis brauchte man noch
Delphi-Quellcode:
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
um die Dialoge ordentlich dargestellt zu bekommen.
Oder selber implementierte Nachrichten Handler für modernere Standard Nachrichten, um diese verarbeiten zu können.

Das Problem wird sicher überall existieren und fällt aber mit bestimten Konfigurationen mehr auf.

stalkingwolf 26. Jan 2023 10:54

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von Sinspin (Beitrag 1517868)
Hallo,

Das klingt als wenn sich Handler für Window Botschaften gegenseitig fertig machen.
Visuell sind Delphi Komponenten im Einsatz?

ja und VirtualStringTree. Aber das nutzen wir auch in anderen Programmen und haben dort nicht diese Probleme.
Einzig AcroPDF ist vorhanden, aber das habe ich alles entfernt und das Problem tritt dennoch auf.

AQTime werde ich einmal testen ob mir das etwas sinnvolles ausgibt.

jaenicke 26. Jan 2023 11:10

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Ich würde zunächst einmal schauen, ob der Window Detective in dem Moment, wenn es hängt, die Abarbeitung von massenhaft Messages anzeigt. Das kann schon Hinweise geben.

stalkingwolf 26. Jan 2023 12:21

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
keins der beiden Programme zeigt mir in dem Moment was an. Kommen keine Einträge.

Nur ein Problem habe ich entfernt indem ich application.processmessages entfernt habe.
Das nutzen wir eigentlich aber noch relativ häufig.

Edit : Was mir bei dem Programm auch auffällt. Alle MessageDLG und showmessage landen hinter dem Programm.
Aber das Programm ist nicht stayontop.

Stevie 26. Jan 2023 13:14

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
ProcessExplorer als Admin starten - Rechtsklick auf den entsprechenden Prozess - Properties - Threads Tab und dort den Thread raussuchen, der die CPU verbrennt - selektieren und auf Stack klicken. Dort ruhig bisschen auf Refresh hämmern und beobachten, was da so auftaucht. Kann unter Umständen schon einen Hinweis geben.

Wenn remote debuggen auf den Rechner bei euch in der Firma möglich ist - über die IDE connecten und dann den entsprechenden Thread beobachten.

Michael II 26. Jan 2023 13:31

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Ich würde deine hängenden Projekte mal mit zum Beispiel Eurekalog laufen lassen. Das kann bei Hängern sehr helfen.
Delphi IDE Menu Projekt > Eurekalog Optionen unter "Features > Hang Detection" "gewünschte" Zeit einstellen.

Die Meldungsdialoge verhalten sich seit irgendwann XE nicht mehr genau so wie bei D6/7. Da musst du entweder deinen Code umbauen oder die Dialogfunktion so anpassen, dass sich deine App unter den neueren Delphis wie zu D6/7 Zeiten verhält. Sehr wahrscheinlich wird dies helfen:
Application.NormalizeTopMosts;
Application.RestoreTopMosts;

Zum Beispiel so:
Delphi-Quellcode:
function MessgeBoxDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
  Application.NormalizeTopMosts;
  result := VCL.Dialogs.MessageDlg(Msg, DlgType, Buttons, HelpCtx);
  Application.RestoreTopMosts;
end;

Danke jaenicke für den Windows Detective Tipp - kannte ich nicht.

stalkingwolf 26. Jan 2023 15:13

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von Michael II (Beitrag 1517892)
Delphi-Quellcode:
function MessgeBoxDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
  Application.NormalizeTopMosts;
  result := VCL.Dialogs.MessageDlg(Msg, DlgType, Buttons, HelpCtx);
  Application.RestoreTopMosts;
end;

Das bringt leider nichts.

Generell frage ich mich
a) Warum nur das Programm und nicht die anderen 20 die wir portiert haben?
b) Warum nur auf einigen Rechnern?

Michael II 26. Jan 2023 16:28

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von stalkingwolf (Beitrag 1517896)
Das bringt leider nichts.

Generell frage ich mich
a) Warum nur das Programm und nicht die anderen 20 die wir portiert haben?
b) Warum nur auf einigen Rechnern?

Windowsmeldungen werden nicht überall gleich "nett" abgearbeitet ;-). Ich hatte jetzt beim Wechsel auf D11 auch ein paar Probleme, welche leider nur auf einigen Maschinen auftraten und seit Delphi 2 nie. Und ich behaupte damit nicht, dass D11 das Problem ist.

Das mit den Meldungsfenstern hinter dem Hauptfenster. Falls die Meldungsfenster nach dem Restore der App hinten landen: Falls in diesem Fall NormalizeTopMosts; RestoreTopMosts; nix bringt: Ich habe eine (funktionierende) Bastellösung: Via Application.Components durch alle Forms wühlen und jene mit StayOnTop und dann noch jene mit Classname TMessageForm nach vorn bringen. Aber ich poste das hier nicht, da sicher jemand dann mit einem Einzeiler kontert, welcher das Problem auch und wesentlich schöner löst ;-).

Und das mit dem "Hänger". Hast du nun mal mit Eurekalog gecheckt, was aufgezeichnet worden ist?

stalkingwolf 26. Jan 2023 16:39

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
[QUOTE=Michael II;1517902]
Zitat:

Zitat von stalkingwolf (Beitrag 1517896)
Und das mit dem "Hänger". Hast du nun mal mit Eurekalog gecheckt, was aufgezeichnet worden ist?

ich habe die Einstellung nicht gefunden.

Ich habe das Programm nun komplett zusammengestrichen. Sind nur noch 5 von 30 Units und immer noch das gleiche.

Auch bei dem Dialog im Hintergrund. Ich hole diesen nach vorne. klicke den Dialog weg. Programm läuft auf 25% und bekomme es nicht beendet.
Minimiere es, maximiere es wieder und kann es danach beenden.

Dann tritt aber ein Fehler auf. laut AQTime irgendwo in der Kernel32.dll bei AddClipboardFormatListener(). Das nutzen wir selber nicht.

himitsu 26. Jan 2023 16:53

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Es wurden viele stellen verändert.
Das OldCreateOrder wurde in Delphi 11 oder 10 abgeschafft.

ganz früher war OnCreate im Constructor,
später im AfterConstruct, aber beim Upgrade alter Forms wurde OldCreateOrder=True gespeichert und wenn es True ist, dann doch im Contructor
und jetzt ist es immer AfterConstruct ... also alte Forms, wo es "bisher noch ging, aber der Entwickler seit 15 Jahren vergessen hat das entlich mal zu bereinigen", da kann es jetzt knallen.


Und dann auch am PopupPatent
oder sonstwo

Michael II 26. Jan 2023 20:00

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
[QUOTE=stalkingwolf;1517904][QUOTE=Michael II;1517902]
Zitat:

Zitat von stalkingwolf (Beitrag 1517896)
Und das mit dem "Hänger". Hast du nun mal mit Eurekalog gecheckt, was aufgezeichnet worden ist?

ich habe die Einstellung nicht gefunden.

Die Einstellung findest du natürlich erst, nachdem du Eurekalog installierst hast.

stalkingwolf 27. Jan 2023 07:38

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
[QUOTE=Michael II;1517910][QUOTE=stalkingwolf;1517904]
Zitat:

Zitat von Michael II (Beitrag 1517902)
Zitat:

Zitat von stalkingwolf (Beitrag 1517896)
Und das mit dem "Hänger". Hast du nun mal mit Eurekalog gecheckt, was aufgezeichnet worden ist?

ich habe die Einstellung nicht gefunden.

Die Einstellung findest du natürlich erst, nachdem du Eurekalog installierst hast.

das erklärt es :-)
Ich hab es eingebunden und aktiv.

Nun erhalte ich im Programm die Meldung "Datenbank ist nicht zugewiesen." Mit der Option das Programm zu beenden und mir eine Meldung anzuzeigen.
Bei allem hängt danach das Programm komplett und nichts passiert mehr.

Jasocul 27. Jan 2023 07:55

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von stalkingwolf (Beitrag 1517922)
Nun erhalte ich im Programm die Meldung "Datenbank ist nicht zugewiesen." Mit der Option das Programm zu beenden und mir eine Meldung anzuzeigen.
Bei allem hängt danach das Programm komplett und nichts passiert mehr.

Das klingt für mich nach zwei Fehlern.
DB nicht zugewiesen muss nicht bedeuten, dass die Meldung den korrekten Fehler meldet. Es könnte auch sein, dass eine Einstellung nicht korrekt ist und erstmal versucht wird, an die DB zu kommen (Programm hängt).
Wenn die Zuweisung der DB oder deren Einstellung im OnCreate gemacht wird: Siehe den Beitrag von himitsu über OldCreateOrder.
In Kombination dieser Fehler könnte das beschriebene Verhalten entstehen.

Windows-Messaging-Probleme würde ich allerdings auch nicht ausschließen. iirc kann da auch die exzessive Nutzung von ProcessMessages mit reinspielen.

stalkingwolf 27. Jan 2023 07:57

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von himitsu (Beitrag 1517906)
Es wurden viele stellen verändert.
Das OldCreateOrder wurde in Delphi 11 oder 10 abgeschafft.

danach habe ich einmal gesucht und in keinem unserer Projekte ist es auf True.

stalkingwolf 27. Jan 2023 07:58

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von Jasocul (Beitrag 1517923)
Zitat:

Zitat von stalkingwolf (Beitrag 1517922)
Nun erhalte ich im Programm die Meldung "Datenbank ist nicht zugewiesen." Mit der Option das Programm zu beenden und mir eine Meldung anzuzeigen.
Bei allem hängt danach das Programm komplett und nichts passiert mehr.

Das klingt für mich nach zwei Fehlern.
DB nicht zugewiesen muss nicht bedeuten, dass die Meldung den korrekten Fehler meldet. Es könnte auch sein, dass eine Einstellung nicht korrekt ist und erstmal versucht wird, an die DB zu kommen (Programm hängt).
.

D.h die Meldung ist nicht von dem EurkaLog sondern aus dem Programm?

Jasocul 27. Jan 2023 08:13

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von stalkingwolf (Beitrag 1517925)
D.h die Meldung ist nicht von dem EurkaLog sondern aus dem Programm?

Ich habe Eurekalog noch nie verwendet, aber ich könnte mir vorstellen, dass das eine Exception anzeigt, die innerhalb der Anwendung verdeckt wurde:
Delphi-Quellcode:
try
  // Mache irgendwas
except
  // keine Behandlung der Exception
end;
Aber das ist jetzt nur geraten.

Michael II 27. Jan 2023 09:55

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von stalkingwolf (Beitrag 1517922)
Nun erhalte ich im Programm die Meldung "Datenbank ist nicht zugewiesen." Mit der Option das Programm zu beenden und mir eine Meldung anzuzeigen.
Bei allem hängt danach das Programm komplett und nichts passiert mehr.

In den Optionen von Eurekalog (Delphi IDE > Projekt > Eurekalog, dann dort unter "Bug report" kannst du angeben wo deine App die Problemmeldungen speichern soll, zum Beispiel %AppData%\<MEINEAPP>\Eurekalog\
Geh nach dem Testen deiner App in diesen Ordner und öffne einen Report, klick oben in Report Fenster auf Stack Trace. Klick auf eine der Zeilen; Delphi wird geöffnet und zeigt dir die Stelle im Code an.
(Bei Hänger Problemen - zum Beispiel wegen Misshandlung der Windows Warteschlange - siehst du immerhin, was gerade so lief; bei echten Exceptions hilft's natürlich noch mehr.)

...und lösch zuerst alle ProcessMessages aus deinem Code ;-).

stalkingwolf 27. Jan 2023 11:43

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von Michael II (Beitrag 1517929)
Zitat:

Zitat von stalkingwolf (Beitrag 1517922)
Nun erhalte ich im Programm die Meldung "Datenbank ist nicht zugewiesen." Mit der Option das Programm zu beenden und mir eine Meldung anzuzeigen.
Bei allem hängt danach das Programm komplett und nichts passiert mehr.

In den Optionen von Eurekalog (Delphi IDE > Projekt > Eurekalog, dann dort unter "Bug report" kannst du angeben wo deine App die Problemmeldungen speichern soll, zum Beispiel %AppData%\<MEINEAPP>\Eurekalog\
Geh nach dem Testen deiner App in diesen Ordner und öffne einen Report, klick oben in Report Fenster auf Stack Trace. Klick auf eine der Zeilen; Delphi wird geöffnet und zeigt dir die Stelle im Code an.
(Bei Hänger Problemen - zum Beispiel wegen Misshandlung der Windows Warteschlange - siehst du immerhin, was gerade so lief; bei echten Exceptions hilft's natürlich noch mehr.)

...und lösch zuerst alle ProcessMessages aus deinem Code ;-).

Eurekalog legt mir keine Logs bei dem Ablauf an. Nur wenn ich einen Fehler produziere.
Was mir nun noch aufgefallen ist. Die Messagedlg sind unsichtbar welche angezeigt werden. Erst mit ALT+TAB sieht man diese und das auch nur, wenn man sein Hauptfenster zur Seite schiebt. Die sind dann auch bedienbar.

Das Projekt ist aus meiner Sicht nicht mehr zu retten und kostet mich gerade viel zu viel Zeit.
Ich werde das Projekt am Montag neu aufsetzen. Evtl bekomme ich dadurch raus was genau klemmt. Ich berichte.

Dennoch vielen Dank für die ganzen Infos. Vor allem für genannten Tools welche sehr interessant sind.

Michael II 27. Jan 2023 12:54

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Hast du wie in #8 erwähnt in Eurekalog die "hang detection" eingeschaltet?
Dann sollte es loggen.

Also so:
Delphi IDE Menu Projekt > Eurekalog Optionen unter "Features > Hang Detection" "gewünschte" Zeit einstellen.

Ich habe fertig - Flasche leer. Viel Glück beim neu Aufsetzen.

himitsu 27. Jan 2023 13:08

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von stalkingwolf (Beitrag 1517924)
Zitat:

Zitat von himitsu (Beitrag 1517906)
Es wurden viele stellen verändert.
Das OldCreateOrder wurde in Delphi 11 oder 10 abgeschafft.

danach habe ich einmal gesucht und in keinem unserer Projekte ist es auf True.

Beim Delphi-Upgrade erkennt Delphi das noch fehlende Property, und speichert es als True
der Entwickler kann konnte es auf False stellen.

Im aktuellen Delphi wird das Property gelesen, ignoriert und nicht mehr gespeichert.
Nachteil hast du hier dann, wenn du parallel ein altes Delphi nutzt und es dort beim Laden auf OldCreateOrder=True zurückfällt, weil das Property ja "wieder" fehlt.

stalkingwolf 27. Jan 2023 13:48

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Zitat:

Zitat von Michael II (Beitrag 1517953)
Hast du wie in #8 erwähnt in Eurekalog die "hang detection" eingeschaltet?
Dann sollte es loggen.

Also so:
Delphi IDE Menu Projekt > Eurekalog Optionen unter "Features > Hang Detection" "gewünschte" Zeit einstellen.

Ich habe fertig - Flasche leer. Viel Glück beim neu Aufsetzen.

ja habe ich. auf 4sek ( Standardeinstellung )

stalkingwolf 30. Jan 2023 16:10

AW: D11 : Programm hängt zieht 25% CPU bei UI Aktualisierung
 
Ok habe das Projekt heute "neu" gemacht.

Ich habe ein neues Projekt eröffnet und die Main Form erstellt.
Habe dann alle UI Elemente der Mainform aus dem kaputten Projekt rüber kopiert und die nötigsten Quellcode Anpassungen durchgeführt damit das Programm läuft.

Zum Kunden übertragen und alles funktioniert.
Danach habe ich alle 35 weiteren Units eingebunden. Gleiche Test und funktioniert immer noch.
Danach den gesamten Quellcode der Main Unit als dem alten Projekt rüber kopiert und die ganzen Eigenschaften in der Mainform per Hand gesetzt.

Programm läuft nun einwandfrei.

D.h das einzige was nun anders ist, das ist Form1. Ich weiß immer noch nicht woran es lag. Aber Projekt läuft und mein Chef fragt mich nicht mehr 5x am Tag was Sache ist :-D


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