Frage zu LUA und Finalizer/Destruktor

Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • Hallo zusammen

    Lese schon einige Zeit hier still mit, versuche mich mit EPP (aktuell 15) auch schon einige Zeit, vorallem am Wochenende.

    Die ersten Versuche mit LUA habe ich hinter mich gebracht, aber beim Thema Finalizer/Destruktor habe ich offensichtlich ein Brett mit enorm(st)er Dicke vor dem Kopf.


    Es geht dabei um folgendes:

    Wenn ich eine geöffnete EEP-Anlage schliessen will, soll der aktuelle Stand von eigenen definierten Datenstrukturen in einer Datei gespeichert werden, damit diese Daten beim Öffnen der Anlage wieder geladen und bereit gestellt werden.

    Ich hatte das in etwa so gelöst, was aber nicht funktioniert.


    Datenstruktur (als Beispiel) in der Datei workerprocessor.lua

    Der Code in der Datei "workerprocessor.lua" beinhaltet in etwa folgende Funktionen

    In der Datei "testingen.lua", in der sich die Funktion EEPMain() befindet geschieht etwa folgendes:

    Das funktionierte so wie angedacht leider nicht.

    Also ersetzte ich die Funktion "workerprocessor_finalizer()" mit folgendem Code, um zu schauen, ob die Funktion beim Beenden/Neuladen der Anlage überhaupt aufgerufen wird.

    Im EEP-Ereignisfenster sollten dann

    workerprocessor_finalizer::Start

    workerprocessor_finalizer::Save data

    ausgegeben werden und im Speicherverzeichnis eine Datei "samplestorage.csv" existieren.


    Geschieht allerdings nicht.


    Ich bin mir sicher, das ich einen Denkfehler gemacht hatte, aber das Brett vor dem Kopf hat mittlerweile nach Stunden eine so grosse Dicke...

    Wenn mir jemand helfen könnte, dieses dicke Brett vor dem Kopf wegzukriegen... Wäre ich sehr froh.


    Gruss

    rennsemmel

    EEP: Version 17

    MS Windows 10 Pro 64 Bit

    Aktueller Rechner: Prozessor: Intel Core i9-9900K, RAM: 32 GB, Festplatte: 1TB SSD, Grafikkarte: Nvidia GeForce RTX 2080 Ti

  • Vergiss die Finalizer, Destruktoren oder wie auch immer du sie nennen willst. Das klappt nicht, wie du ja schon festgestellt hast.

    Einzige Alternative: alle Daten sofort speichern, jedes Mal, sobald sie geändert werden.

    Ich würde auch davon abraten, die Daten selbst in eine Datei zu schreiben. Dann passen die Daten nicht mehr zur Anlage, wenn du sie ohne zu speichern schließt.

    Einzige brauchbare Alternative dazu: EEPSetData EEPSaveData. Damit kannst du Daten (als String oder Zahl) in durchnummerierte "Slots" speichern. Die werden dann von EEP zusammen mit der Anlage gespeichert.

    Viele Grüße

    Benny

  • rennsemmel

    Ich habe dein Beispiel mal ausprobiert.

    Bei mir ist EEP auf D:

    Das Verzeichnis muß vorhanden sein:

    D:\Trend\EEP15\LUA\daten

    ohne assert wird ein File erstellt und die Ausgabe erscheint

    Gruß Martin

  • Einzige brauchbare Alternative dazu: EEPSetData.

    EEPSaveData() / EEPLoadData() war die einzige Alternative.

    Jetzt ist mit TagText eine weitere hinzugekommen. Zusätzlich zu den 1000 Datenslots kann man jetzt auch Immobilien und Rollmaterial benutzen, um in String-Form Daten permanent zu speichern und in der Anlage selbst zu sichern.

  • Hallo rennsemmel ,

    wenn du dich für eine "rundum Sorglose" Steuerung in deiner EEP Anlage interessierst,

    dann schau doch mal in meiner Anlagen - Vorlage hinein.
    Mit dieser Vorlage bist du immer auf der sicheren Seite, ein nachträgliches Einfügen

    in ein bestehendes Script ist möglich.

    Entsprechede Demo Anlagen findest du auf meiner Homepage.

    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15

    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

  • Hallo zusammen

    Einzige Alternative: alle Daten sofort speichern, jedes Mal, sobald sie geändert werden.

    Ich würde auch davon abraten, die Daten selbst in eine Datei zu schreiben. Dann passen die Daten nicht mehr zur Anlage, wenn du sie ohne zu speichern schließt.

    Deshalb auch die Idee mit dem Destruktor, um zu verhindern, dass ein Schliessen ohne Speicherung der Daten stattfindet.

    Daten sofort speichern ginge auch, aber das wollte ich an sich vermeiden. Wenn es allerdings nicht anders geht...

    Die Nutzung der Slots wollte ich vermeiden, auch wenn so garantiert ist, dass die Daten in/mit der Anlage gespeichert werden.


    martin51

    Die Funktion "workerprocessor_finalizer()" funktioniert für sich alleine genommen schon.

    Die Idee war, dass kurz vor dem Löschen der Datenstruktur "t_workerprocessor" die in der Variable ""t_workerprocessor.__gc" hinterlegte Funktion "workerprocessor_finalizer()" aufgerufen wird, die wiederum die Funktion "workerprocessor_savefile(t_wpc)" aufruft, um die Daten in die Datei zu schreiben.

    Das scheint nicht zu funktionieren *grummel*. Deshalb findet sich vermutlich auch nur sehr wenig bei der LUA-Dokumentation darüber.

    Parry36

    Ich hatte schon einige Deiner Videos auf Youtube gesehen und bin fasziniert. Ich werde Deine Demoanlage und Scripts gerne anschauen. Danke für den Hinweis.

    Vielen Dank für eure Hilfe.

    Gruss

    rennsemmel

    EEP: Version 17

    MS Windows 10 Pro 64 Bit

    Aktueller Rechner: Prozessor: Intel Core i9-9900K, RAM: 32 GB, Festplatte: 1TB SSD, Grafikkarte: Nvidia GeForce RTX 2080 Ti

  • Deshalb auch die Idee mit dem Destruktor, um zu verhindern, dass ein Schliessen ohne Speicherung der Daten stattfindet.

    Du hast mich missverstanden. Das Problem ist nicht, dass die Daten nicht gespeichert werden. Sondern dass die Daten gespeichert werden, obwohl sie nicht hätten gespeichert werden dürfen.

    Vielleicht wird das Problem mit einem Beispiel deutlicher:

    • Du öffnest deine Anlage, ein Zug steht vor einem Signal, Lua liest aus einer separaten Datei aus, dass eine Anmeldung dafür vorliegt.
    • Die Anmeldung wird "abgearbeitet", der Zug kann weiterfahren, und die Anmeldung wird aus der separaten Datei gelöscht.
    • Irgendetwas geht auf der Anlage schief (Zugzusammenstoß, irgendwas wichtiges gelöscht, oder noch was anderes), sodass du beschließt, die Anlage ohne Speichern neu zu laden.
    • Jetzt steht der Zug wieder vor dem Signal, aber in der separaten Datei wurde die Anmeldung bereits gelöscht. Der Zug wird ewig dort stehen bleiben, wenn du nicht händisch eingreifst.

    Langer Rede, kurzer Sinn: Wenn du die Daten selbst (per Lua) in eine separate Datei speicherst, bekommst du früher oder später "Synchronisationsprobleme", dass die gespeicherten Daten nicht mehr zur Anlage passen.

    Deshalb rate ich dringend dazu, die Slots zu nutzen, die zusammen mit der Anlage gespeichert werden.

    Wenn dir die Slots zu "primitiv" sind, kannst du dir da kunstvolle Dinge (als Beispiele: Persistence von cetz und SlotNames von mir) drumherum basteln. Die Basis sollten aber immer die Slots (oder die von Götz genannten TagTexte) bilden, keine separaten Dateien.


    Viele Grüße

    Benny

  • Hallo Benny

    Danke für Deine Erklärungen. Das macht Sinn.

    Ich werde mir Persistence und SlotNames anschauen.

    Gruss

    rennsemmel

    EEP: Version 17

    MS Windows 10 Pro 64 Bit

    Aktueller Rechner: Prozessor: Intel Core i9-9900K, RAM: 32 GB, Festplatte: 1TB SSD, Grafikkarte: Nvidia GeForce RTX 2080 Ti

  • Einzige brauchbare Alternative dazu: EEPSetData.

    EEPSaveData() / EEPLoadData() war die einzige Alternative.

    Jetzt ist mit TagText eine weitere hinzugekommen. Zusätzlich zu den 1000 Datenslots kann man jetzt auch Immobilien und Rollmaterial benutzen, um in String-Form Daten permanent zu speichern und in der Anlage selbst zu sichern.

    Das ist ja großartig.

    War an mir bisher vorbeigegangen, diese Funktion.

    Dann kann man ja an jedem Rollmaterial seinen eigenen Status z.B. vor Fahrstraßen abspeichern.

    Oder man macht sich Dummy Immobilien, die Informationen erhalten.

    Gruß

    Thomas

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

  • Kann man sich ja extern programmieren und dann mit LUA an die Rollis verteilen.

    Oder einfach eine Excel Liste als CSV mit LUA einlesen.

    Aber nur, wenn sich die Namen nicht ändern.

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

    Einmal editiert, zuletzt von HaNNoveraNer (21. Oktober 2019 um 09:26)

  • Oder jedem Güterwaggon seine Bestimmungsort mitgeben.

    Oder den Namen des auf ihm verladenen Container/sonstigen Ladegut. :ae_1:

    Es fehlt nur eine Eingabemaske

    Das kann ich nur unterschreiben. Die Initialisierung über Lua ist ziemlich umständlich, da man auch mangels Auslesbarkeit nicht mal ein Verkehrsschild mit Texurtextfeld als Eingabefeld nutzen kann. Den passenden Eintrag im Bugtracker gibts aber schon seit einem Jahr.


    Gruß Michael

    35098-katalog-banner-jpg

    Hardwarekonfiguration:
    Laptop: Lenovo IdeaPad Gaming 3, Ryzen 5 5600H, 32GB RAM, Win11 64 bit, EEP 6.1/EEP 17.2 Expert DEV

  • Hallo zusammen,

    ich nutze einen dynamischen Slotmanager zu Speicherung eines Prozessabbildes des SpDrS60. Dabei spielt die Anzahl der Elemente keine Rolle. Um die Kompatibilität des Managers zu gewährleisten, habe ich die Stringlänge auf 950 Zeichen "gedeckelt". Die Speicherung ist "Eventgesteuert".

    Ergänzung zu "TagText": Auch Depotinhalte lassen sich vorab "Taggen".

    Ray