Instanzen einer Klasse während Laufzeit erstellen und darauf zugreifen

Alles rund um die Programmierung mit Qt
Antworten
freakonaleash99
Beiträge: 32
Registriert: 23. Juli 2017 12:35

Instanzen einer Klasse während Laufzeit erstellen und darauf zugreifen

Beitrag von freakonaleash99 » 27. Juni 2020 13:42

Hallo zusammen,

ich möchte ein kleines Tool erstellen welches Log-Dateien einer Maschine auswertet. Die Log-Datei beinhaltet alle Änderungen von diversen Parametern, welche an der Maschine getätigt wurde. Zusätzlich gibt es verschiedene Programme/Rezepte die man an der Maschine laden kann. Die Parameteränderungen beziehen sich also immer auf das geladene Rezept. Mein Ziel ist es, mit dem kleinen Tool ein Rezept auswählen zu können und die aktuell eingestellten Parameter anzuzeigen. Prinzipiell habe ich auch schon eine funktionierende Lösung gefunden - das Logfile entsprechend auszuwerten ist nicht schwierig, da man dieses einfach nur zeilenweise durchlaufen muss und nach entsprechneden Keywords wie "Load Recipe:" oder "Change Parameter XXX" durchsuchen muss. Was ich nun gerne thematisieren möchte, ist die Abspeicherung und der Zugriff auf die interessanten Werte.
Nun erstmal ein Beispiel, wie so eine Log-Datei aufgebaut ist:
12.03.2020 12:31 Load Recipe: "blabla1"
12.03.2020 14:55 change Parameter "X" to "2"
13.03.2020 12:31 change Parameter "B" to "1"
13.03.2020 14:55 change Parameter "A" to "5"
14.03.2020 12:31 change Parameter "X" to "1"
14.03.2020 14:55 Load Recipe: "blabla2"
15.03.2020 12:31 change Parameter "R" to "66"
15.03.2020 14:55 change Parameter "X" to "2"
16.03.2020 12:31 change Parameter "C" to "1"
16.03.2020 14:55 change Parameter "X" to "8"
usw.
Jedes Rezept ist im Grund gleich aufgebaut und hat Parameter A bis Z. Die Dateien können mehrere MB groß sein und haben natürlich sehr viele Zeilen.

In meinem Tool soll also ein beliebiges Rezept ausgewählt werden können und der User bekommt eine Übersicht aller Paramter von A bis Z mit aktuellen, zuletzt eingestellten Werten.

Ich habe dazu zwei Methoden wie ich das programmiertechnisch lösen kann:
1. Das Log-File bei jeder neuen Rezeptauswahl komplett neu durchlaufen und es wird nur nach dem ausgewählten Rezept und dessen Parameteränderungen gesucht.
2. Das Log-File wird beim Start des Programms einmal durchlaufen und alle Werte für alle Rezepte werden direkt ermittelt und in einzelnen Textdateien (mit File-Name = Rezept-Name) abgespeichert. Bei der Auswahl des gewünschten Rezepts im Tool wird dann nur noch die entsprechende Textdatei geladen.

Nun habe ich mir gedacht, dass es doch auch eleganter gehen muss, ohne dass zusätzliche Textdateien erstellt werden. Im Grunde kann man doch eine Klasse erstellen, welche ein solches Rezept abbildet. Statt Textdateien werden dann für jedes Rezept eine Instanz dieser Klasse erzeugt.

Mein Problem ist allerdings: ich weiß nicht wie ich das Umsetzen kann bzw. wie ich dann die einzelnen Objekte ansprechend kann. Theoretisch müsste ja der Objektname (bzw. die Objektvariable) dem Rezeptname entsprechen so dass Objekte mit den Namen "blabla1" und "blabla2" erzeugt werden. Auf Parameter würde ich dann z.B. über "blabla1.get_Paramater("X")" zugreifen. Ich kann aber ein Objekt "blabla1" bisher nur direkt im Code vergeben. Geht sowas auch während der Laufzeit? "blabla1" ist ja vorher noch gar nicht bekannt....
Die Eingabe des Rezepts in der GUI des Tools würde über ein Dropdown-Menü geschehen, so dass ich den Rezept-Name eigentlich auch nur als "String" vorliegen habe. Aber ein String mit einer Objekt-Variablen kann ich irgendwie auch schwer vergleichen....

Ich hoffe, ihr versteht mein Problem.

Im Vorfeld vielen Dank für Hilfe.

tamasi
Beiträge: 45
Registriert: 5. Juli 2007 15:49

Re: Instanzen einer Klasse während Laufzeit erstellen und darauf zugreifen

Beitrag von tamasi » 1. Juli 2020 11:10

Hallo,

das ist eigentlich ziemlich einfach.

Du hast da mehrere Möglichkeiten.

Erstelle dir einen Member-Vector QVector<Rezept>, der die ganze Laufzeit über gültig bleibt. Du kannst auch Rezept* als Templateparameter nehmen. Nimmt sich nicht viel.
Eine eventuell elegantere Möglichkeit wäre ein QHash<QString (Rezeptname), Rezept>. Da kannst du besser ein Rezept per Key suchen.

Während du die Datei liest erzeugt du für jedes neue Rezept ein lokales Objekter vom Typ Rezept oder Rezept*.
Das füllst du mit deinen Werten und packst dass dann per append an den Vector oder per insert in den Hash. Dabei wird eine "Dauerhafte" Kopie erzeugt. Auf diese Kopie kannst du jederzeit zugreifen.

Mal grob als Code (c_to, d_tor usw lasse ich weg):

Es gibt ne Rezept.h Rezept.cpp für den Inhalt der Rezepte.

Dann gibt es eine Verwaltungsklasse VK.h vk.cpp:

vk.h:

#include Rezept.h //bei typ

class Rezept; //bei pointer

class Verwaltung
{
public:
void einlesen(Datei);

private:
QVector<Rezept> m_rezepte;
oder halt als Hash
QHash<QString,Rezpet> m_hashRezept

}

vk.cpp

#include vk.h
#include Rezept.h //bei Pointer

void Verwaltung::einlesen() {

Datei öffnen
Blöck einlesen
while (noch ein Block vorhanden) {
Rezept r; //oder Rezept *r = new Rezept;
r.x = a;
r.y = b;
....
m_rezept.append(r);// bzw m_hashRezept.insert(auswählbarer name, r);
}

Antworten