Tema: Re: Visual studio 5 ir modaline forma
Autorius: Jornada Del Muerto
Data: 2010-10-28 18:09:48
Sveikas,

> Na taip, o vat kaip uzdarineti, kuriuo budu geriau ?
> Dim OpenFileDialog as new Form2
> -------------------------------------
> Form2.close
> OpenFileDialog.close
> Me.Close

Jeigu tai bus tatinis klases memberis ir inicializuosi ji tik pirma karta antra karta nedarant new Klase, ta prasme:

'Klases zona:
public class blabla.....

    ' Statinis memberis saugantis dialoga - si objekta viena kart sukuri ir daugiau nekuri - dideti ram bent del jo neturetu tada
    static _Object as ManoDialogas = null;

    ' Dialogo iskvietimas
    public Start ( path as string ) Sub
        
        ' Sis tikrinimas kurs nauja dialoga tik jeigu jo dar nebus sukurta, tai yra 1 karta per visa programos darba
        if IsNothing( _Object) Then
            _Object = new ManoDialogas(path)
        end if

        _Object.ShowDialog()

        ' cia kazka darai su rezultatu

    End Sub
    
    Uzdarineti nieko nereikia, tiesiog visam programos darbo laikui tada bus sukurtas 1 dialogas ir naudojamas kiekvieno iskvietimo metu tik jis - atmintis didet neturetu

> Pasibandziau visus budus, ir ziurint per taskmanager`i rezultatai keisti, 
> nesvarbu kaip uzdarineju, naudojamos atminties nesumazeja, o kelis kartus 
> atidarius ir vel uzdarius su kiekvienu kartu naudojamos atminteis kiekis 
> auga, kokia tai mistika...

    Jeigu darai butent kaip as parasiau auksciau ir atminties sunaudojimas auga, tai labai panasu kad auga del kazko kito ne del pacios dialogo klases, o galbut del to ka ji viduje dar daro.

    1. Viens dalykas kaip naudoti garbage collector:

    GC.Collect() ' Iskvietus sia fukcija turetu atlaisvinti visa jau nenaudojama atminti, taciau tai blogas stilius ji naudoti release versijose, bet testuotis tai aisku gali

    2. Prasuk 100 ar daugiau to dialogo iskvietimu cikla, kaip nors ji automatu uzdarinejant po atidarymo kad nereiketu ok spaudineti 100 kartu ir paziurek ar butent nuo sio iskvietimo auga, gali buti kad viduje sio dialogo ar kazkur kitur kazkoki objekta daug kartu darai new ir poto kazkur lieka jis issaugotas kad kabo atmintyje.

    Ta prasme gali gale sio Start metodo testams idet GC.Collect() ir be jo prasukt 100 karteliu.

    3. Analizuok vidini savo dialogo funkcionaluma issamiau analizuojant jo viduje vykstancia logika, ta prasme ne viso dialogo kvietima bet konkreciai kuri vieta isaugina RAM naudojima ir palieka ji nesumazinus, maza tikimybe kad tai kaltas dialogas.

    4. Tokiem Memory Leak'u (kas greiciausia kazkur pas tave vyksta) gaudymui gerai labai loginti atminties sunaudojima, susikuri loginimo i faila klase ir tenai irasineji einamaja programos eiga, tiesa pasakius loginimo klase kiekviens save gerbiantis developeris turi, pvz kaip man teke rasyti nemazai WinNT service'u ar webservice'u ten nebuvo galimybes msgbox'ais issivedinet kazkokia debug info ir loginimas buvo neisvengiamas kad suprasti kas vyksta.

    Geriausia loginimo ideologija tai sukurti loginimo lygius, pbz.
    0 - Errors - logini tik klaidas, exception ir pan.
    2 - Function calls - be errors logini dar ir funkciju kvietimus, ta prasme kiekvienos funkcijos pradzioje irasinejama i loga kokia funkcija buvo iskviesta, tada matant errorus eina suvokt kokioj funkcijoj buvo jis;
    3 - Data flow - loginama ne vien funkciju callai, bet ir konkretus duomenys
    4 - All - loginama viskas, pries kiekviena vb.net instrukcija iasinejama i faila jos iskvietimas, duomenys viskas.
    
    tada butu kazkas tokio:

class Logger 

    dim _level as int = 4
    dim _file as string

    ' konstruktorius
    public Logger (level as int , file as string ) 
        _level = level
        _file = file
    
    public sub write(level as int, text as string)
        
        ' jei logo lygis yra mazesnis arba lygus nustatyam reiskia tai loginti
        if level<= _level then
            ' irasineji cia i faila (butu kazkas tokio) bet cia rasau is galvos

            dim writeSubject as string     ' sita yrasinesi i faila

        writeSubject = "[" & DateTime.Now.ToString() & "] [" & _level.ToString() & "] " & text ' suformuoji stringa su data, laiku ir loginimo lygiu

        '' tada irasineji i faila
          

        end if
    end sub

O programoje geriausia kaip statini inicializuoji kazkur Logger objekta _Logger:

    public sub ManoMetodas (parametras as string)
        _Logger.write(2, "START ManoMetodas [" & parametras & "]")
    try
    
        '''' if kazkokia logika apdirbanti parametras         

        _Logger,write(3, "Inicializuojamas dialogas [" & parametras & "]")
        ManoDialogas dlg = new ManoDialogas(parametras)

    ''''    
            
    _Logger.write (2, "END ManoMetodas SUCCESS")

    catch Exception ex
        ' Errorai paprastai visada loginami 
        _Logger.write(0,  ex.Message & vbNewLine & wx.StackTrace)

' Taip gausi debuginimo ir loginimo sistema kur neesant problemu galesi sumazinti irasu i loga kieki, o esant bedomis isijungti daugiau informacijos, paprastai level parametra mes saugodavome registruose kad nereiketu lyst i koda nuejus pas klienta o uztektu tik registruose ilindus log leveli padidint kad daugiau info eitu, logo per mazai niekada nebuna, galima det pries kiekviena funkcija ipac tuo metu kai dar neisgaudyti bugai

    Tavo atveju i loga reiketu dar kiekviena karta irasineti atminties sunaudojima, kiek ram naudoja, tada po kiekvienos funkcijos matytum kas pasigrobe ir neatidave ram, va cia keletas nuorodu kur ieskoti, pasiimk geriausiai veikianti buda ir implementink loginimo sistema tada kad kiekviena karta be datos ir levelio dar fiksuotu ir free memory, galu gale taip gali prakontroliuoti viska:

http://www.eggheadcafe.com/sample-code/csharp.NET/9090c5b8-fc8d-4b89-8632-9cba6460c78f/get-system-memory-size-in-net.aspx

http://www.dotnetspider.com/resources/4612-Find-Memory-usage-CPU-usage.aspx
http://aspalliance.com/806
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/13556100-5bf8-4bfc-8504-d1068b0b20c8

p.S. As asmeniskai itariu kad beda ne paciam dialoge.