AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Variablen einer Klasse auslesen

Ein Thema von Timmyew · begonnen am 10. Mai 2021 · letzter Beitrag vom 10. Mai 2021
Antwort Antwort
Seite 1 von 2  1 2   
Timmyew

Registriert seit: 6. Jan 2020
7 Beiträge
 
#1

Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 10:29
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...)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#2

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 10:41
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?
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Timmyew

Registriert seit: 6. Jan 2020
7 Beiträge
 
#3

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 10:49
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.

Geändert von Timmyew (10. Mai 2021 um 10:51 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.170 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 11:00
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 System.Rtti findet: Hier kannst du eine 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 TNotifyEvent sind ist das auch möglich, aber noch fummeliger. Auch hier findet man alles in System.Rtti .
  Mit Zitat antworten Zitat
Timmyew

Registriert seit: 6. Jan 2020
7 Beiträge
 
#5

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 11:05
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 ^^.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.170 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 11:19
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?
  Mit Zitat antworten Zitat
Timmyew

Registriert seit: 6. Jan 2020
7 Beiträge
 
#7

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 11:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.472 Beiträge
 
Delphi 12 Athens
 
#8

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 12:14
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 12:18
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.170 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Variablen einer Klasse auslesen

  Alt 10. Mai 2021, 13:12
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?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:35 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