Release befehl

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

kog

Betreff: Release befehl

BeitragDi, Okt 23, 2012 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag zusammen.

Wie nutzt man richtig den Befehl "Release" unter SuperStrict?

mfg

*edit*

Hat sich erledigt, nach langem ausprobieren kam ich darauf, das man nicht das Objekt angeben muss, sondern das Handle.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

BladeRunner

Moderator

BeitragDi, Okt 23, 2012 18:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten benutzt Du release garnicht, denn der GC macht die Arbeit normalerweise sehr gut.
Zudem widerspricht sich Superstrict und Integer-Handle ein wenig.
Die Integerhandle machen dein Programm langsamer und schlechter wartbar.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragDi, Okt 23, 2012 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nutze HandleFromObject mit LuaReflection zusammen.
Dann kann ich eine Allgemeine Args Variabel machen:

Call("Init",["handleDesObjekts","o","Integer","i","floats","f"])

Ausser du hast vielleicht einen anderen vorschlag? um es Flexibel handhaben zu können
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

BladeRunner

Moderator

BeitragDi, Okt 23, 2012 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, mit Lua habe ich mich nur sehr begrenzt auseinandergesetzt, daher kann ich dir da keine Alternative nennen. Da jedoch hier ein Umgehen des GC stattfindet ist dies in der Tat wohl einer der seltenen Fälle für ein Release.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragDi, Okt 23, 2012 22:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja ich meinte auch nicht bezogen auf Lua, sondern wie du es sonst lösen würdest, mein Call ansatz sieht so aus:
BlitzMax: [AUSKLAPPEN]
	Function Call:Int(cmd:String,args:String[]=Null,d:Byte=0,d2:Byte=0)
lua_getfield(TLua.state, LUA_GLOBALSINDEX, cmd)
If Not lua_isfunction(TLua.state,lua_gettop(TLua.state)) Then Return 0
If d=0 Print("Lua: Calling Function ~q"+cmd+"(...)~q")
lua_pushstring(TLua.state, cmd)
lua_gettable(TLua.state, LUA_GLOBALSINDEX)
Local a:Byte=0
If args.length>0
a=args.length/2
Local v:String
For Local i:Byte=0 Until args.length Step 2
v=args[i]
Select args[i+1]
Case "i" lua_pushinteger(tlua.state,Int(v))
Case "n" lua_pushnumber(TLua.state,Int(v))
Case "f" lua_pushnumber(tlua.state,Float(v))
Case "o"
Local o:Object=HandleToObject(Int(v))
lua_pushbmaxobject(tlua.state, o)
Default lua_pushstring(TLua.state,v)
End Select
Next
End If
Local res:Int=lua_pcall(TLua.state, a,1,0)
If res<>0 Print "Lua Error: "+GetError() Return 0

Local p:Int=lua_gettop(TLua.state)
Local i:Int=lua_tonumber(TLua.state,p)
lua_pop(TLua.state,p)
Return i
End Function
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

BladeRunner

Moderator

BeitragMi, Okt 24, 2012 8:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich das richtig sehe übergibst Du der Funktion einen IntegerHandle und lässt daraus das Objekt ableiten. Da Du damit aber ja eine gültige Referenz in Form eines Objektes erschaffst sollte das Release dann doch unnötig sein - der GC kümmert sich um das generierte Objekt ja sobald es seinen Scope verlassen hat. Interessant wäre eher wo Du das Objekthandle generierst, denn dort sehe ich eher die Gefahr dass ein Leck entsteht.
Hast Du denn wachsende Speicherauslastung im Taskmanager?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragMi, Okt 24, 2012 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, ich habe eine Klasse names TObject, in der New() methode wird direkt das Handle geholt um so unnötig jedesmal aufrufen zu müssem bei der Call funktion.
Und wenn ich dann ein Objekt zerstören muss, habe ich eine Remove() methode eingebaut um das Handle wieder freizugeben, damit der GC das Objekt zerstören kann.

Wie würdest du dann das bewerkstelligen um Flexible Parameter zu haben?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

BladeRunner

Moderator

BeitragMi, Okt 24, 2012 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne es jetzt getestet zu haben wäre mein Ansatz eher wie folgt:
BlitzMax: [AUSKLAPPEN]
Function Bla(args:Object[])
For Local o:Object = EachIn args
If Blub(o) Then...



Dann müstest Du zwar Integer und Co. in einen Type wrappen aber wärst weg von Objekthandles.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragMi, Okt 24, 2012 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es jetzt so ähnlich gelöst.

Das ich einen 2. Paramter für "Objects" hinzugefügt habe:
BlitzMax: [AUSKLAPPEN]
	Function Call:Int(cmd:String,args:String[]=Null,objs:Object[],d:Byte=0,d2:Byte=0)
lua_getfield(TLua.state, LUA_GLOBALSINDEX, cmd)
If Not lua_isfunction(TLua.state,lua_gettop(TLua.state)) Then Return 0
If d=0 Print("Lua: Calling Function ~q"+cmd+"(...)~q")
lua_pushstring(TLua.state, cmd)
lua_gettable(TLua.state, LUA_GLOBALSINDEX)
Local a:Byte=0
If args.length>0
a=args.length/2
Local v:String
For Local i:Byte=0 Until args.length Step 2
v=args[i]
Select args[i+1]
Case "i" lua_pushinteger(tlua.state,Int(v))
Case "n" lua_pushnumber(TLua.state,Int(v))
Case "f" lua_pushnumber(tlua.state,Float(v))
Case "o"
If i<objs.length
Local o:Object=objs[i]'HandleToObject(Int(v))
lua_pushbmaxobject(tlua.state, o)
EndIf
Default lua_pushstring(TLua.state,v)
End Select
Next
End If
Local res:Int=lua_pcall(TLua.state, a,1,0)
If res<>0 Print "Lua Error: "+GetError() Return 0

Local p:Int=lua_gettop(TLua.state)
Local i:Int=lua_tonumber(TLua.state,p)
lua_pop(TLua.state,p)
Return i
End Function


Hoffe so ist die bessere alternative?

so kann ich nun: Call("Test",["","o"],[self]) machen
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group