Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Variablen einer Klasse auslesen (https://www.delphipraxis.net/207858-variablen-einer-klasse-auslesen.html)

Timmyew 10. Mai 2021 09:29

Variablen einer Klasse auslesen
 
Guten Morgen,

ich wollte von euch wissen, ob es eine Möglichkeit gibt alle TNotifyEvent Variablen einer Klasse während der Laufzeit auszulesen und zu verändern.
Ich möchte gerne eine Klasse schreiben, die mir jede Aktion eines Programmes protokolliert.
Mithilfe dieser Klasse könnte ich in Zukunft schwerwiegende Fehler bei Softwaretests schneller ausfindig machen und beheben.
Diese Klasse führt unteranderem eine Zeitmessung durch und protokolliert die Dauer des ausgeführten Codeabschnittes.

Falls es in diesem speziellen Problem keine vernünftige Lösung geben sollte, muss ich wohl oder übel die Werte der Variablen manuell auslesen.. :/ (OnClick, OnChange, OnResize etc...)

bernau 10. Mai 2021 09:41

AW: Variablen einer Klasse auslesen
 
Interessehalber mal eine Frage:

Was machst du, wenn du die Variable hast? Du müsstest dich ja irgendwie einklinken. Das Event auf deine Klasse umleiten und dann selber das Event aufrufen. Oder?

Timmyew 10. Mai 2021 09:49

AW: Variablen einer Klasse auslesen
 
Ja das tue ich.

Die Events werden in einer Dictionary gespeichert.
Beim ausführen eines Events wird die in der Klasse programmierte TNotify Methode aufgerufen und führt dann das eigentliche Event aus.
Damit bin ich in der Lage die Zeitmessung um das Event drumherum zu bauen ohne dieses in das eigentlichen Programm rein zu programmieren.
Damit Spare ich mir viel Zeit und habe eine schöne Analyse meines Programms.

Der schöne Günther 10. Mai 2021 10:00

AW: Variablen einer Klasse auslesen
 
Gibt es einen Grund weshalb du keinen üblichen "Profiler" dafür verwendest?

Zu Fuß umsetzen lässt sich das über den Kram den man in
Delphi-Quellcode:
System.Rtti
findet: Hier kannst du eine
Delphi-Quellcode:
TVirtualMethodInterceptor
nehmen und bei einer Instanz deiner Klasse vor, nach und im Exception-Fall etwas tun (z.B. Zeiten loggen). Wie der Name schon sagt lässt sich das nur mit virtuellen Methoden umsetzen.

Falls es dir wirklich, wie du ja eigentlich sagst, darum geht, alle Felder zu belegen die mit "On..." beginnen und vom Typ
Delphi-Quellcode:
TNotifyEvent
sind ist das auch möglich, aber noch fummeliger. Auch hier findet man alles in
Delphi-Quellcode:
System.Rtti
.

Timmyew 10. Mai 2021 10:05

AW: Variablen einer Klasse auslesen
 
Der Grund ist, dass ich noch in der Ausbildung zum FAAE bin und daher noch nicht so erfahren bin :(

Ich konnte bei meinen Recherchen leider nichts finden und habe deswegen diesen Beitrag eröffnet ^^.

Der schöne Günther 10. Mai 2021 10:19

AW: Variablen einer Klasse auslesen
 
Alles klar 😉

Was du dir vorgenommen hast ist aber auch wirklich nicht trivial. Wenn du von "alle Aktionen" sprichst, dann meinst du wahrscheinlich die grafischen Elemente (TForm, TButton), oder? Wenn ja, das will tatsächlich keiner von Hand machen.

Du musst aber auch davon ausgehen, dass ebendiese TNotifyEvents schon belegt sind (ein TButton.OnClick, ein TForm.OnResize) weil da schonmal jemand was reinprogrammiert hat. In dem Fall musst du nehmen was im jeweiligen Event drinsteht, das dir wo wegspeichern, das Event auf deine eigene Routine zeigen lassen, das passende weggespeicherte finden, aufrufen, die Zeit messen, einen eventuellen Fehlerfall protokollieren, und das vernünftig wegloggen. Und dafür auch nicht zu lange brauchen, denn sonst verfälscht du auch die Ergebnisse, wie Zeitmessung. Ich glaube so etwas macht man auch nicht einmal an zwei Tagen nebenher...

Mir ist noch nicht klar wie man damit "Fehler" findet. Bislang hört es sich nach reiner Performance-Messung an. Kann es sein dass du nur die Exceptions loggen möchtest, statt der wenig hilfreichen Messageboxen auf dem Bildschirm?

Timmyew 10. Mai 2021 10:29

AW: Variablen einer Klasse auslesen
 
Jap, damit sind alle TControls gemeint.

Das loggen übernimmt in dem Fall die Zeitmessung ^^.

Die Zeitmessungklasse habe ich schon programmiert. (Diese funktioniert tadellos)
Diese verwende ich in der neuen Klasse auch.
Ja du hast Recht, die Klasse dient dazu die Performance zu Messen.

Allerdings ist mir vor einigen Wochen ein Bug aufgefallen, der die Software scheinbar willkürlich zum hängen bringt. (2-10 Sekunden)
Dabei wäre es sehr hilfreich gewesen, wenn man solch eine Klasse gehabt hätte.
Schließlich konnte ich den Fehler mithilfe der Zeitmessung ausfindig machen und beheben.

Die Klasse dient dann so wie du es bereits beschrieben hast dazu, die Performance zu messen und in seltenen Fällen Fehler ausfindig zu machen.

Uwe Raabe 10. Mai 2021 11:14

AW: Variablen einer Klasse auslesen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1489006)
Du musst aber auch davon ausgehen, dass ebendiese TNotifyEvents schon belegt sind (ein TButton.OnClick, ein TForm.OnResize) weil da schonmal jemand was reinprogrammiert hat. In dem Fall musst du nehmen was im jeweiligen Event drinsteht, das dir wo wegspeichern, das Event auf deine eigene Routine zeigen lassen

Das könnte schwierig werden, wenn Events dynamisch im Programm zugewiesen werden bzw. Komponenten dynamisch erzeugt werden.

himitsu 10. Mai 2021 11:18

AW: Variablen einer Klasse auslesen
 
Zeiger des alten Events in Variable speichern, bevor man sich selbst registriert (überschreibt).
Und das dann im eigenen Event aufrufen.

(bei "dynamisch", wenn Deines nachher wieder vom Programm überschrieben wird, dann hast Problem)

Man könnte noch via TVirtualMethodInterceptor sich reinhängen, aber wäre ist wie einen Blauwal auf einen armen Spatzen zu werfen.

Der schöne Günther 10. Mai 2021 12:12

AW: Variablen einer Klasse auslesen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1489019)
Das könnte schwierig werden, wenn Events dynamisch im Programm zugewiesen werden bzw. Komponenten dynamisch erzeugt werden.

Ja, das kommt erschwerend hinzu.

Wenn der Anwendungsfall wirklich ist "Ich will mitloggen wenn der Hauptthread der Anwendung hängt" würde ich das trotzdem anders machen. Ich hatte so etwas mal angefangen, aber nie zu Ende geführt: Ich meine man konnte einen Thread erstellen der periodisch Messages an den Hauptthread sendet und wenn der nicht schnell genug antwortet konnte man den Stack des Hauptthreads zu dem Zeitpunkt feststellen und das dann loggen. Dann konnte man direkt sehen was sich aufgehangen hat.

Denn selbst wenn man jedes "OnChange"-Event mit seiner Ausführungszeit mitloggt, ich glaube nicht dass ich zuverlässig feststellen könnte, was denn nun diese lang hängende Aktion ausgelöst hat. Was wenn ich drei Frames mit jeweils einem "submitButton: TButton" drauf habe: Woher weiß ich jetzt, welches Absenden das Programm zum Hängen gebracht hat?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.
Seite 1 von 2  1 2      

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