Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#26 7. 10. 2011 18:28:11

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makra v Calcu VYŘEŠENO

Pro Ip : Právě na to jsem se ptal, když jsem odkazoval na ty dvě makra "vzorec". Rozumím tomu
1. přpad : B3 = oSheet.getCellbyPosition(1,2) - deklaruji adresu buňky nic jinho, pak ale volám buňku, kde se musí načíst hodnota (B3.Value). Ta se čte teprve v okamžiku, kdy se podmínka vyhodnocuje. Ve 2. případě deklaruji B3 = oSheet.getCellbyPosition(1,2).Value a v paměti je přímo hodnota, která se vkládá místo volaného "B3". Je mi také jasné, že procesy jdou více vlákny současně, a že se může stát něco takového, jako předběhnutí následného procesu před časově nadřazený. To už je asi věc operačního systému (Profesionál verze řadí procesy jinak, nežli Home verze). Tomu sice moc nerozumím, ale vím, že takový problém být může. jenže u maker by měla být posloupnost dodržena. Mám například odzkoušena primitivní makra nad rozsáhlými tabulkami vzorců. Tam dochází k přepočítávání vzorců v řádech tisíců. Chod ovládám většinou jedinou buňkou a tenhle hromadný proces nic takového neudělá. Dokonce je ve výsledku rychlejší nežli systémy, které používají lexigrafický systém generování po jedné položce, byť je generátor sebe sofistikovanější. Nedá se to zese uplatnit vždy. Ale když to jde - upřednostňuji to. Také narážíš na problém optimalizace, kterou když zdárně zvládnu, tak podržím nějakým Wait(xy) ms. Dneska jsem měl jiné plány, ale zítra budu zase experimentovat a prubnu Danovo řešení.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#27 7. 10. 2011 22:18:46

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: Makra v Calcu VYŘEŠENO

O žádných vláknech jsem se nezmiňoval. Jde prostě o to, že v main_2 hodnotu buňky načtete před zahájením cyklu.


Aby bylo zřejmé, o čem jsem psal o optimalizaci, upravil jsem makro následovně:

const nVar = 10000
const nOpak = 40000    ' nastavíme, aby se muselo ukládat

sub main_pole

dim variace() 
dim cislo as long
dim PosledniAdresa as long

' stopneme si dobu
nTimer0 = Timer()

oSheet = ThisComponent.sheets(0)

'Nastavíme promenné

B3 = oSheet.getCellbyPosition(1,2).value
C3 = oSheet.getCellbyPosition(2,2).value

D3 = oSheet.getCellbyPosition(3,2).value            ' limita počtu výsledků;
E3 = oSheet.getCellbyPosition(4,2).value            ' aktuální uložený počet výsledků

cislo = 0 ' číslo prvního řádku v poli
PosledniAdresa = E3 + 2        ' nastavíme podle počtu uložených hodnot

VelikostPole = D3 - E3
if VelikostPole > nVar then VelikostPole = nVar

variace = oSheet.getCellRangeByPosition(0, PosledniAdresa, 0, PosledniAdresa+VelikostPole).getDataArray   ' "A3:A10002"

For iCount = 1 To nOpak
      IF VelikostPole <= cislo Then ' zapiseme (mezi)vysledek
        oSheet.getCellbyPosition(1,2).value = B3
        oSheet.getCellbyPosition(2,2).value = C3
        oSheet.getCellRangeByPosition(0, PosledniAdresa, 0, PosledniAdresa+VelikostPole).setDataArray(variace)
        ' D3    neukladame    
        ' E3    neukladame - je tam vzorec

        cislo = 0 ' číslo prvního řádku v poli resetujeme

        PosledniAdresa = PosledniAdresa + VelikostPole            ' nastavíme podle počtu uložených hodnot

        E3 = E3 + VelikostPole        ' Nastavime pocet ziskanych variaci
        VelikostPole = D3 - E3        ' znovu nastavime velikost pole
        if VelikostPole > nVar then VelikostPole = nVar
        variace = oSheet.getCellRangeByPosition(0, PosledniAdresa, 0, PosledniAdresa+VelikostPole).getDataArray 

        IF D3 <= E3 Then 
            nTotal = Timer() - nTimer0
               Print "Doba " + nTotal + " sec"
               Print "Překopíruj a smaž výsledky"

            Exit Sub
           End If
       end if
       
      C3 = B3+C3
      variace(cislo)(0)= C3
    cislo = cislo + 1

Next iCount

end sub

Ve srovnání: Na mém počítači
makro "main_1" generuje 20 hodnot za 6 sec, "main_zapis_vzorec" generuje 500 hodnot zhruba 5 sec. Za stejnou dobu vygeneruje upravená varianta přes 30000 hodnot.

(makro neukládá výsledky, když cyklus skončí regulerně, lze snadno doplnit)

Editoval lp. (7. 10. 2011 23:45:28)

Offline

#28 8. 10. 2011 07:00:01

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Makra v Calcu VYŘEŠENO

Pro Ip : Zkusil jsem a je to tak. Děkuji moc. Když by se tady dávalo nějaké ohodnocení, dal bych Ti určitě nejvyšší. Ještě jednou dík.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

Zápatí