Tema: Re: Visual studio 5 ir modaline forma
Autorius: Jornada Del Muerto
Data: 2010-11-02 12:28:01
    Svariai viska darant taip, o jei aplamai tai ne butinai, ziurint ka darai viduje to dialogo, pvz viduje jis jei saveikaus su kazkokiais isoriniais objektais kurie nebus naikinami ir saugos informacija apie ji ar su jo objektais man rodos irgi nesinaikins, kaikuriem objektam nepakanka sito, o tenka dar Dispose dadejineti ar visus reference'us i ji ir jo ojektus null'int.

"Valdas" <valdonas@super.lt> wrote in message news:iadqd1$p1j$1@trimpas.omnitel.net...
> Na matai, as darau taip:
> Private Sub fOpenFileDialog(ByVal Path as string, ByVal as Filter as string)
>    Dim OpenFileDialog as New Form2 'cia tik dabar sukuriamas OpenFileDialog 
> objektas
>    OpenFileDialog.ShowDialog() 'cia jis parodomas
> End Sub 'tai kai is sito sub`o iseinu tai turetu OpenFileDialog objectas 
> susinaikinti ?
> 
> "Jornada Del Muerto" <Jornada@Lythum.lt> wrote in message 
> news:iac3ns$3jh$1@trimpas.omnitel.net...
>> 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. 
> 
>