C# problem z odchytenim ukoncenia vykreslenia formy a objekt

Programovacie jazyky, rady, poradňa...
LugoG
Novice
Novice
Príspevky: 4
Registrovaný: 08 okt 2013, 9:31

C# problem z odchytenim ukoncenia vykreslenia formy a objekt

Príspevok od používateľa LugoG »

Neviem prist na to ako odchytit ukoncenie vykreslenia formy a objektov.

Podrobnejsie:

Pri spusteni programu sa spusti "inicializacia objektov" a metoda "Load" a vsetky objekty sa vykreslia na obrazovku.
Ja potrebujem spustit akciu až ked su vsetky objekty vykreslene. Nie paralelne zo spustenim ,ani v priebehu.

Viete mi poradit?
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa axxis »

Ked pracujes s microsoftimi vecami vzdy hladaj LifeCycle. Je to poradie Eventov (na pozadi sa deje teda trochu nieco ine, ale cela akcia je reprezentovana aj eventami), ktore sa volaju pri vytvarani a destrukcii Formu (ASPX stranky alebo niecoho ineho...)


LifeCycle pre windows forms je:

Kód: Vybrať všetko

Control.HandleCreated 

Control.BindingContextChanged 

Form.Load 

Control.VisibleChanged 

Form.Activated 

Form.Shown
[/b]

Ale ak chces aby sa nieco vykonalo na konci Loadu tak to proste napis na jeho koniec a malo by to byt v poriadku. (A ak by si to z nejakeho dovodu nechcel mat na konci Loadu tak to daj to akehokolvek eventu, ktory nasleduje v zivotnom cykle) Ak sa to rozhodnes umiestnit do nejakeho neskorsieho eventu pocitaj ale s tym, ze sa moze odpalovat niekolkokrat. Napr. Form.Activated sa spusta ak opustis svoj form a potom sa donho vratis (prepnes sa na iny program a vratis sa spat)
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa pcsiete »

Je určite lepšie nedávať jednotlivé akcie do eventov na základe poradia, ale významu, takže nie akýkoľvek event.
V tvojom prípade by som vybral "Shown", ale záleží na okolnosti, teda či chceš aby sa akcia vykonala keď sa okno "zobrazí". Ak chceš aby sa niečo vykonalo po načítaní ("Load"), potom
Microsoft Developer Network napísal: The OnLoad method also allows derived classes to handle the event without attaching a delegate. This is the preferred technique for handling the event in a derived class.
teda

Kód: Vybrať všetko

protected override OnLoad(EventArgs a) {
    base.OnLoad(a);
   
    //kód
    ....
}
LugoG
Novice
Novice
Príspevky: 4
Registrovaný: 08 okt 2013, 9:31

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa LugoG »

Form.load a Form.Activated a podobne, som skusal a prebehnu skor ako sa dokonci vykreslenie.

To sa da zistit jednoducho: Na konci metody zadat MessageBox a formular sa zobrazi az ked odkliknes hlasku.
Ja potrebujem aby sa zobrazila automaticky hlaska(to len pre priklad) az ked je formular do-kresleny.
alebo
napr. nieco ako....dokresli sa tlacitko az potom mozes nan kliknut a nieco vykonat... ale ja chcem nieco vykonat automaticky ale az ked vsetky objekty su komplentne...

spustena funkcia je natolko narocna, ze spomali vykreslenie formularu az je vidno ako vykresluje bod po bode......nevyzera to dobre...
ja potrebujem len pri prvom spusteni: vykreslit objekty , form.enabled = false , cursor = wait do ukoncenia funkcie a vypisanie vysledku do formularu, form.enabled = true....atd.

Shown som neskusal, zajtra vyskusam....
Este skusam hladat... :-) ... zatial dik za snahu..


A ani Shown ... nevyhovel...
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa pcsiete »

Neviem či si neuvedomuješ že vykresľovanie okna nie je kreslenie.
To že niečo nevidíš na obrazovke ešte neznamená že to tam naozaj nie je.

Jednak že vykresľovanie kontroliek je vec najprv .NET(vystavanie, vykreslenie nejakých špecialít) a potom operačného systému, a potom znova os a ktorý to smeruje do hw (prípad viacerých grafických kariet, viacerých okien). Pri "vykresľovaní" nedochádza ku kresleniu na obrazovku, ale ku zapisovaniu do rôznych bufferov pre rôzne okná, ktoré sa potom ešte znova zaobaľujú a vypočítava sa napr. ich pozícia, alpha a pod.

Prepíš OnLoad a budeš mať istotu, že k vykonaniu tvojho kódu dôjde až po zavolaní Load.
LugoG
Novice
Novice
Príspevky: 4
Registrovaný: 08 okt 2013, 9:31

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa LugoG »

Nechcem riesit co je vykreslenie a ci uz objekt existuje v pamäti atd.
Mne ide o vizualny efekt. Zo strany uzivatela vyzera pomale vykreslovanie ako ze ma ten program nejaky problem.
Uzivatelovy je jedno co sa robi na pozadi, on povie "je to skarede a nejake pomale ci co".

Aby sme sa rozumeli ... pre mna je rozdiel "po zavolani Load" a "po ukonceni vsetkych operacii, ktore nastartovali v Load".

Vyskusam OnLoad a uvidime.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa pcsiete »

Ty tam štartuješ nejaké pararelné thready? Inak jednotlivé prvky odosielajú operačnému systému správy ktoré spracováva a rovnako to robia aj konkrétne okná, ktoré jednotlivé správy zachytávajú a využívajú/vykonávajú pomocou eventov.
Shown ti bude fungovať.
LugoG napísal:To sa da zistit jednoducho: Na konci metody zadat MessageBox a formular sa zobrazi az ked odkliknes hlasku.
Nie, toto je maximálne mylný test. MsgBox:

Kód: Vybrať všetko

LRESULT CALLBACK WndProc(...) {
    switch(msg) {
         case WM_SHOWWINDOW:
             //príkaz na zobrazenie okna je prijatý
             //zavolá sa load
             bla->bla->bla->event_Load(...);    
             //tu pokračujeme až po zobrazení a odkliknutí MessageBoxu
             DefWindowProc(); //až teraz vykresľujeme okno, hoci Load už prebehol
             break;
         ....
    }
}
void bla::bla::bla::event_Load(...) {
    //všetky správy sú zastavené, kým sa vykonáva Load
    int result = MessageBox(.....);
    //tu sa dostaneme až po odkliknutí tlačidla
    return;
}

Napísané narýchlo, ale podstatu vystihuje. Ak okno zachytí event a spracováva v ňom nejakú funkciu, k ďalšej správe sa už nedostane pokým sa vykonávanie funkcie neukončí a my sa nedostaneme k ďalšiemu zavolaniu wndproc.
LugoG
Novice
Novice
Príspevky: 4
Registrovaný: 08 okt 2013, 9:31

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa LugoG »

Po nejakom case som sa vratil k tomuto problemu.

Poziadavka je odoslana do SQL, takze pravdepodobne spusti pararelný thread.

Uz som spominal ,ze Shown nefunguje, objavi sa formular ,nieco ako negativ foto a caka a pohne sa dalej az po 3-5 sekundach.
(za ten cas sa da urobit aj Screnn, keby som mohol vlozit obrazok tak vam ho tu ukazem :-) )
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob

Príspevok od používateľa pcsiete »

Thread so ziskanim odpovede si spusti ty.
Shown nefunguje, tento specialny event vytvoreny konkretne .NET developermi ako nadstavbu na WinAPI prave na tento ucel je tam drzany microsoftom naschval. Oni si totiz pred svetom odmietaju pripustit ze vytvorili bezvyznamny nefunkcny kod, a taki programatori ako ty na tom potom prave trpia.
pre tych co nepochopili: </irony>
Napísať odpoveď