![]() |
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...) |
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? |
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. |
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:
findet: Hier kannst du eine
System.Rtti
Delphi-Quellcode:
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.
TVirtualMethodInterceptor
Falls es dir wirklich, wie du ja eigentlich sagst, darum geht, alle Felder zu belegen die mit "On..." beginnen und vom Typ
Delphi-Quellcode:
sind ist das auch möglich, aber noch fummeliger. Auch hier findet man alles in
TNotifyEvent
Delphi-Quellcode:
.
System.Rtti
|
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 ^^. |
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? |
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. |
AW: Variablen einer Klasse auslesen
Zitat:
|
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. |
AW: Variablen einer Klasse auslesen
Zitat:
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 18:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz