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
function workerprocessor_detach()
local t_workerprocessor = {
__gc = nil, -- soll auf die Funktion "workerprocessor_finalizer" zeigen, wenn alles korrekt initialisiert wurde
m_szclassname = "workerprocessor",
m_t_lds = lds_detach(), -- lua data storage
m_binited = false,
m_szstoragefilename = ""
}
return t_workerprocessor
end
Alles anzeigen
Der Code in der Datei "workerprocessor.lua" beinhaltet in etwa folgende Funktionen
function workerprocessor_init(t_wpc, szstoragefilename)
-- t_wpc ist eine Datenstruktur vom Typ t_workerprocessor
local bvalid = true
-- Code
-- wenn alles richtig initialisiert wurde
-- Pointer auf Funktion Finalizer aus der Datei "testingen.lua" setzen
if( bvalid==true ) then
t_wpc.__gc=workerprocessor_finalizer
end
end
function workerprocessor_loadfile(t_wpc)
-- Code
end
function workerprocessor_savefile(t_wpc)
-- Code
end
Alles anzeigen
In der Datei "testingen.lua", in der sich die Funktion EEPMain() befindet geschieht etwa folgendes:
-- von https://emaps-eep.de/lua/code-schnipsel
setmetatable(_ENV,{__index=function(s,k) local n=k:gsub("%.",","); local p=load(n);if p then local f=function(z) local s=Zugname;Zugname=z;p();Zugname=s end;_ENV[k]=f;_ENV[n]=f;return f end;return nil end})
require("lua\\workerprocessor")
local lprgct = 0
local m_workerprocessor = workerprocessor_detach() -- Datenstruktur definieren, deren Inhalt beim Beenden von EEP in einer Datei gespeichert werden soll
local m_szworkerfilestoragefilename = get_eepstoragepath().."workerprocessor.csv" -- get_eepstoragepath() definiert den Speicherort (hier "C:\\Trend\\EEP15\\LUA\\daten\\")
function EEPMain()
local bvalid = true
-- Initialisiere alles
if( lprgct==0 ) then
-- vorhergehende Dinge
-- workerprocessor
if( bvalid==true ) then
bvalid = workerprocessor_init(m_workerprocessor, m_szworkerfilestoragefilename)
end
end
if( lprgct==60000) then lprgct=1 end
lprgct=lprgct+1
end
-- diese Funktion soll aufgerufen werden, BEVOR der Inhalt von m_workerprocessor (beim Beenden, Neuladen) gelöscht wird
function workerprocessor_finalizer()
workerprocessor_savefile(m_workerprocessor)
end
Alles anzeigen
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.
function workerprocessor_finalizer()
local szfunctionname = "workerprocessor_finalizer"
local szfilename = get_eepstoragepath().."samplestorage.csv"
local file = assert(io.open(szfilename, "w")) -- neue datei schreiben
local szdatas = os.date("%d.%m.%Y %H:%M:%S")
-- würde sonst aufgerufen werden
-- workerprocessor_savefile(m_workerprocessor)
-- für Testzwecke, ob diese Funktion überhaupt aufgerufen wird
print(szfunctionname.."::Start")
if( file~=nil ) then
print(szfunctionname.."::Save data")
-- ausgeben
io.output(file)
file:write(szdatas)
file:write("\n")
-- close file
io.close(file)
end
end
Alles anzeigen
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