Hlášeno zde: 152613 – Macro Basic: RAM isn't deallocated when macro is finished
Spustit Libre a nějaký sledovač paměti - pod Win10 používám normální Správce úloh přes Ctrl+Alt+Del.
Spustit makro devourRAM (dělá rekurzi pro procházení pole různých podpolí) například jen z Basic editoru - není to moc rychlý tak je tam ukazatel průběhu. Zabere to asi 0,5 GB RAMky. Ověřit ve sledovači paměti.
A když makro skončí, tak ta paměť zůstane obsazená. Je možný zavřít třeba Basic Editor a zůstat jen v Libre Starteru, ale RAM je pořád obsazená.
Až zavření celého Libre paměť uvolní.
Testováno Libre 7.4.3.2 a 7.6.0.0.aplha0+ pod Win10x64
private gi&, gpOut() 'index and array for result
Sub devourRAM
dim oDoc as object, i&, p(), oStatusbar, iStep&
const j=20000 'increase this to devour more RAM
oStatusbar=getController.StatusIndicator
oStatusbar.start("It isn't so fast :-(", j)
p=array(1, 2, 3, array(1, 2, 3, array(1, 2, 3), 4, array(1, 2, 3), 4, array(1, array(2, 3))), 4, array(1,2,3), array(1, 2, array(1,2), 3), _
array(1, 2, 3, array(1, 2, 3, array(1, 2, 3), 4, array(1, 2, 3), 4, array(1, array(2, 3))), 4, array(1,2,3), array(1, 2, array(1,2), 3) ), _
array(1, 2, 3, array(1, 2, 3, array(1, 2, 3), 4, array(1, 2, 3), 4, array(1, array(2, 3))), 4, array(1,2,3), array(1, 2, array(1,2), 3) ), _
array(1, 2, 3, array(1, 2, 3, array(1, 2, 3), 4, array(1, 2, 3), 4, array(1, array(2, 3))), 4, array(1,2,3), array(1, 2, array(1,2), 3) ), _
array(1, 2, 3, array(1, 2, 3, array(1, 2, 3), 4, array(1, 2, 3), 4, array(1, array(2, 3))), 4, array(1,2,3), array(1, 2, array(1,2), 3) ) )
redim gpOut(130)
for i=1 to j
gi=0
recurArray(p, "") 'recursion
iStep=iStep+1 'for statusbar
if iStep=10 then 'set new value
oStatusbar.setValue(i)
iStep=0
end if
next i
oStatusbar.reset
gi=0
gpOut()=0
End Sub
Function recurArray(level as variant, s$) 'recursion for reading the sub-arrays, output to global array gpOut
dim i&
if level(0)>0 then 'for the count of current word
gpOut(gi)=array( s, level(0) ) 'add to global output array
gi=gi+1
end if
for i=1+lbound(level) to ubound(level) 'next indexes in level
if isArray(level(i)) then
recurArray(level(i), s & i) 'get sub-level
else
gpOut(gi)=array( s, level(0) ) 'add to global output array
gi=gi+1
end if
next i
End Function
Function getController() as object 'get oDoc.CurrentController for progressbar, also if only Basic IDE is running
dim oDoc as object
oDoc=ThisComponent
if isNull(CreateUnoService("com.sun.star.reflection.CoreReflection").getType(oDoc)) OR _
isNull(CreateUnoService("com.sun.star.script.Invocation").createInstanceWithArguments(array(oDoc))) then 'regular oDoc isn't, try to get other Libre window like Basic editor
dim oComponents as object, oComponent as object
oComponents=StarDesktop.Components.CreateEnumeration
while oComponents.hasMoreElements 'try all Libre windows
oComponent=oComponents.NextElement
if oComponent.Identifier="com.sun.star.script.BasicIDE" then 'Basic Editor is active
getController=oComponent.CurrentController
exit function
end if
wend
oDoc =StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, array()) 'open new document in Writer for progressbar
else
getController=oDoc.CurrentController
end if
End Function