[OffTopic]
Wieso werde ich nach 5 oder 10 Minuten schon ausgeloggt?
Das ist ja schlimmer, als es für mich war, als ich noch vom Handy gepostet habe...
[/OffTopic]
So, nunmal... eine kleine Umsetzung der Idee, die NicTheQuick uns gab, wenn ich ihn richtig verstanden habe.
Code: Alles auswählen
DeclareModule Vars
Structure Var_Variable
Name$
Point. Q
Size. Q
EndStructure
NewList Vars. Var_Variable ()
Declare. Q GetQuad (Name$, Type. B)
Declare. D GetDouble (Name$, Type. B)
Declare$ GetString (Name$)
Declare RegistrateVar (Name$, Type. B, Value$)
Declare UnregistrateVar (Name$)
Declare UpdateVar (Name$, Value$)
EndDeclareModule
Module Vars
Procedure. Q GetQuad (Name$, Type. B)
Shared Vars ()
ForEach Vars ()
If Vars ()\ Name$ = Name$
Select Type
Case #PB_Ascii
ProcedureReturn PeekA (Vars ()\ Point)
Case #PB_Byte
ProcedureReturn PeekB (Vars ()\ Point)
Case #PB_Character
ProcedureReturn PeekC (Vars ()\ Point)
Case #PB_Integer
ProcedureReturn PeekI (Vars ()\ Point)
Case #PB_Long
ProcedureReturn PeekL (Vars ()\ Point)
Case #PB_Quad
ProcedureReturn PeekQ (Vars ()\ Point)
Case #PB_Unicode
ProcedureReturn PeekU (Vars ()\ Point)
Case #PB_Word
ProcedureReturn PeekW (Vars ()\ Point)
EndSelect
EndIf
Next
EndProcedure
Procedure. D GetDouble (Name$, Type. B)
Shared Vars ()
ForEach Vars ()
If Vars ()\ Name$ = Name$
Select Type
Case #PB_Double
ProcedureReturn PeekD (Vars ()\ Point)
Case #PB_Float
ProcedureReturn PeekA (Vars ()\ Point)
EndSelect
EndIf
Next
EndProcedure
Procedure$ GetString (Name$)
Shared Vars ()
ForEach Vars ()
If Vars ()\ Name$ = Name$
Select Type
Case #PB_String
ProcedureReturn PeekS (Vars ()\ Point)
EndSelect
EndIf
Next
EndProcedure
Procedure RegistrateVar (Name$, Type. B, Value$)
Shared Vars ()
AddElement (Vars ())
Vars ()\ Name$ = Name$
Select Type
Case #PB_Ascii
Vars ()\ Size = 1
Case #PB_Byte
Vars ()\ Size = 1
Case #PB_Character
Vars ()\ Size = StringByteLength (Space (1))
Case #PB_Double
Vars ()\ Size = 8
Case #PB_Float
Vars ()\ Size = 4
Case #PB_Integer
If #PB_Compiler_Processor = #PB_Processor_x64
Vars ()\ Size = 8
Else
Vars ()\ Size = 4
EndIf
Case #PB_Long
Vars ()\ Size = 4
Case #PB_Quad
Vars ()\ Size = 8
Case #PB_String
Vars ()\ Size = StringByteLength (Value$)
Case #PB_Unicode
Vars ()\ Size = 2
Case #PB_Word
Vars ()\ Size = 2
EndSelect
Vars ()\ Point = AllocateMemory (Vars ()\ Size)
Select Type
Case #PB_Ascii
PokeA (Vars ()\ Point, Val (Value$))
Case #PB_Byte
PokeB (Vars ()\ Point, Val (Value$))
Case #PB_Character
PokeC (Vars ()\ Point, Val (Value$))
Case #PB_Double
PokeD (Vars ()\ Point, ValD (Value$))
Case #PB_Float
PokeF (Vars ()\ Point, ValF (Value$))
Case #PB_Integer
PokeI (Vars ()\ Point, Val (Value$))
Case #PB_Long
PokeL (Vars ()\ Point, Val (Value$))
Case #PB_Quad
PokeQ (Vars ()\ Point, Val (Value$))
Case #PB_String
PokeS (Vars ()\ Point, Value$)
Case #PB_Unicode
PokeU (Vars ()\ Point, Val (Value$))
Case #PB_Word
PokeW (Vars ()\ Point, Val (Value$))
EndSelect
EndProcedure
Procedure UnregistrateVar (Name$)
Shared Vars ()
ForEach Vars ()
If Vars ()\ Name$ = Name$
FreeMemory (Vars ()\ Point)
DeleteElement (Vars ())
ProcedureReturn
EndIf
Next
EndProcedure
Procedure UpdateVar (Name$, Value$)
Shared Vars ()
ForEach Vars ()
If Vars ()\ Name$ = Name$
Select Type
Case #PB_Ascii
PokeA (Vars ()\ Point, Val (Value$))
Case #PB_Byte
PokeB (Vars ()\ Point, Val (Value$))
Case #PB_Character
PokeC (Vars ()\ Point, Val (Value$))
Case #PB_Double
PokeD (Vars ()\ Point, ValD (Value$))
Case #PB_Float
PokeF (Vars ()\ Point, ValF (Value$))
Case #PB_Integer
PokeI (Vars ()\ Point, Val (Value$))
Case #PB_Long
PokeL (Vars ()\ Point, Val (Value$))
Case #PB_Quad
PokeQ (Vars ()\ Point, Val (Value$))
Case #PB_String
PokeS (Vars ()\ Point, Value$)
Case #PB_Unicode
PokeU (Vars ()\ Point, Val (Value$))
Case #PB_Word
PokeW (Vars ()\ Point, Val (Value$))
EndSelect
ProcedureReturn
EndIf
Next
EndProcedure
EndModule
Macro DefineAscii (Name, Value)
Vars:: RegistrateVar (Name, #PB_Ascii, Str(Value))
EndMacro
Macro DefineByte (Name, Value)
Vars:: RegistrateVar (Name, #PB_Byte, Str(Value))
EndMacro
Macro DefineCharacter (Name, Value)
Vars:: RegistrateVar (Name, #PB_Character, Str(Value))
EndMacro
Macro DefineDouble (Name, Value)
Vars:: RegistrateVar (Name, #PB_Double, Str(Value))
EndMacro
Macro DefineFloat (Name, Value)
Vars:: RegistrateVar (Name, #PB_Float, Str(Value))
EndMacro
Macro DefineInteger (Name, Value)
Vars:: RegistrateVar (Name, #PB_Integer, Str(Value))
EndMacro
Macro DefineLong (Name, Value)
Vars:: RegistrateVar (Name, #PB_Long, Str(Value))
EndMacro
Macro DefineQuad (Name, Value)
Vars:: RegistrateVar (Name, #PB_Quad, Str(Value))
EndMacro
Macro DefineString (Name, Value)
Vars:: RegistrateVar (Name, #PB_String, Value)
EndMacro
Macro DefineUnicode (Name, Value)
Vars:: RegistrateVar (Name, #PB_Unicode, Str(Value))
EndMacro
Macro DefineWord (Name, Value)
Vars:: RegistrateVar (Name, #PB_Word, Str(Value))
EndMacro
Macro FreeVar (Name)
Vars:: UnregistrateVar (Name)
EndMacro
Macro SetVar (Name, Value)
Vars:: UpdateVar (Name, Str (Value))
EndMacro
Macro ValueOfAscii (Name)
Vars:: GetQuad (Name, #PB_Ascii)
EndMacro
Macro ValueOfByte (Name)
Vars:: GetQuad (Name, #PB_Byte)
EndMacro
Macro ValueOfCharacter (Name)
Vars:: GetQuad (Name, #PB_Character))
EndMacro
Macro ValueOfDouble (Name)
Vars:: GetDouble (Name, #PB_Double)
EndMacro
Macro ValueOfFloat (Name)
Vars:: GetDouble (Name, #PB_Float)
EndMacro
Macro ValueOfInteger (Name)
Vars:: GetQuad (Name, #PB_Integer)
EndMacro
Macro ValueOfLong (Name)
Vars:: GetQuad (Name, #PB_Long)
EndMacro
Macro ValueOfQuad (Name)
Vars:: GetQuad (Name, #PB_Quad)
EndMacro
Macro ValueOfString (Name)
Vars:: GetString (Name, #PB_String)
EndMacro
Macro ValueOfUnicode (Name)
Vars:: GetQuad (Name, #PB_Unicode)
EndMacro
Macro ValueOfWord (Name)
Vars:: GetQuad (Name, #PB_Word)
EndMacro
Mit diesem Testcode könnt ihr mal euren Speicher ein wenig füllen, nur um zu sehen, wie er sich wieder entleert:
Code: Alles auswählen
For Index = 1 To 4000000
DefineQuad ("Test" + Str (Index), Index)
Next
MessageRequester ("", "Vars created. Your program should be using about 400 MB RAM now. We're now going to free the vars. Watch the memory usage.")
For Index = 1 To 4000000
FreeVar ("Test" + Str (Index))
Next
MessageRequester ("", "RAM usage should be down to low. Click OK to finish.")
Dabei fällt dem Einen oder Anderen sicher auf: Nach der Ausführung der Variableneliminierung liegen noch etwa 40 MB im Arbeitsspeicher. Woran mag das liegen?
/e: So, Kinderz, und jetzt bitte kein Herumgemaule a lá "Was soll das bringen? Du speicherst zehnmal so viele Daten, wie mit 'normalen' Variablen!"!
