Diskuze: Pomalá inicializace komponent
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Neregistrovaný

Zobrazeno 30 zpráv z 30.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Popiš přesněji program co má dělat. Kolik tam máš komponent ? Je potřeba je mít všechny inicializované hned ze začátku ? nešlo yb to rozdělit na více formů ? Proč tolik PictureBoxů ?
Představ si například mapu (form s pozadím mapy). A na mapě jsou pictureBoxy, které symbolizují body. Po kliknutí na daný bod (pB) se otevře nové okno (form) s informacemi o daném bodě. A jelikož jde ze startu vidět celá mapa, je potřeba, aby všechny pB byly inicializované současně hned ze startu.
Rozdělit to načítání dobrázků do více vláken-> 3 vlákna -> Main, BackgroundWorker1 a BackgroundWorker2. Každému BackgroundWorkeru dáš načíst 5 PB. (a bud se nactou soucasne, na to pouzijes RunWorkCOmplete Event, nebo se nactou tak jak je vlakna spracuji)
Pár odkazů - na netu je toho spousta, stačí googlit:)
http://www.dotnetperls.com/backgroundworker
http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners
http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo
http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx
Je nějaký zásadní rozdíl mezi BackgroundWorkerem a Threadem? Myslím z hlediska vytížení procesoru. A jak mám přidělit BGW1 5 pBoxu, když ty se načítají z metody InitializeComponent(). Děkuji.
BackgroundWorker má nižší prioritu (4) než normální thread (9), a normálně si ty pb odeber z designeru a přidej si je tam pomocí kódu
Neměl bys tu mapu i s body spíše kreslit na 1 picturebox přes Graphics? Pokud tam máš desítky PB, tak se nediv, že to je pomalé.
Zkusiljsem hlavní program běžet na MainThreadu a
inicializaci jsem provedl v bgWorker1. Je to sice o něco
rychlejší, ale stále je to pomalé Tak jsem zkusil inicializaci provést v NewThreadu...
Rychlost načítání je stejná a vytížení CPU je nižší. Jak je to
možné?
Myslím si, že najlepšie bude to vyriešiť tak ako píše sdraco cez graphics.
Jestli je to i přes BGW pomalé, tak rychlejší způsob nenajdeš.
Inicializace pictureboxu je hold nákladná narežii jen mě napadá, to dělat
paralelně tu inicializaci.
Jestli je to i přes BGW pomalé, tak rychlejší způsob nenajdeš.
Inicializace pictureboxu je hold nákladná narežii jen mě napadá, to dělat
paralelně tu inicializaci.
Jak říká sdraco, udělej to přes Graphics.
Asi to nebude ideální řešení, ale metodu InicializeComponent() si můžeš rozdělit na:
private void InicializeComponent()
{
//tady budes mit 5 pictureBocu
}
private void InicializeComponent1()
{
//tady budes mit dalsich 5 pictureBocu
}
kazdou inicializaci spustíš v jinem BGV. Myslim, ze to tak pude, ale vhodné řešení to asi není.
Přes Graphic to asi nepůjde... Ty body nejsou jen tečky, ale jsou to obrázky typu PNG... Například, kdyby byla mapa Evropy, tak na pozici Paříže by byl pictureBox Eiffelovy věže atd. Napadlo mě, že bych místo pBoxů použil labely, ale nevím, jestli je rozdíl mezi inicializací pBoxů a labelů...
Ještě by nebylo špatné zvážit využítí WPF, protože tam je vykreslování 5x-10x rychlejší.
Je to skoro úplně to samé a jsou tam třeba nové vychytané komponenty.
A kdy tedy používat WF a kdy WPF? Je na to nějaké pravidlo?
Nejčastěji by se dalo říči toto: Když chceš vykreslovat (rychle) použij WPF, jinak stačí WP.
Ještě znám jedno pravidlo: Pokud je něco pomalé, odeber zbytečné komponenty.
Když umíš WPF, používej WPF. Pokud umíš WF, používej WF. Potom u větších aplikaci se doporučuje WPF, protože jsou výkonnější.
Zobrazeno 30 zpráv z 30.