Diskuze: Pomalá inicializace komponent

C# .NET .NET (C# a Visual Basic) Pomalá inicializace komponent American English version English version

Avatar
noName
Neregistrovaný
Avatar
noName:

Zdravím. Udělal jsem aplikaci s cca deseti pictureBoxy. Jenže když aplikaci roskliknu, trvá strašně dlouho, než se načtou všechny komponenty. Nevíte někdo jak tento proces urychlit, nebo jak by se to dalo jinak řešit?

 
Odpovědět 27.10.2013 9:00
Avatar
Odpovídá na noName
Jakub Lásko[Saarix]:

Obsahují komponenty obrazky, nebo jsou prázdné?

Nahoru Odpovědět 27.10.2013 9:10
Časem je vše možné.
Avatar
noName
Neregistrovaný
Avatar
noName:

Z počátku jsou prázdné, ale hned po inicializaci se tam načtou obrázky.

 
Nahoru Odpovědět 27.10.2013 9:13
Avatar
noName
Neregistrovaný
Avatar
noName:

Nevíš, zda to jde řešit například přes BackgroundWorker? Pokud ANO, tak jak?

 
Nahoru Odpovědět 27.10.2013 11:57
Avatar
Odpovídá na noName
Josef Kuchař (Pepa489):

A musí tam být tolik pictureboxů?

Nahoru Odpovědět 27.10.2013 20:57
2x piš, jednou debuguj
Avatar
noName
Neregistrovaný
Avatar
noName:

Ano, je potřeba načíst všech 10 PB současně.

 
Nahoru Odpovědět 28.10.2013 12:04
Avatar
Kit
Redaktor
Avatar
Odpovídá na noName
Kit:

Obávám se, že se do mého NTB celých 10 PB nevejde. Možná 100 GB :)

Nahoru Odpovědět  +3 28.10.2013 12:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Kit
noName:

hahaha... Ty mi nemůžeš pomoct?

 
Nahoru Odpovědět 28.10.2013 12:25
Avatar
Kit
Redaktor
Avatar
Odpovídá na noName
Kit:

V tomhle ti asi nepomůžu, tak jsem si alespoň trochu zatrollil.

Nahoru Odpovědět  +1 28.10.2013 12:29
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na noName
Petr Nymsa:

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ů ?

Nahoru Odpovědět 28.10.2013 12:31
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
noName
Neregistrovaný
Avatar
noName:

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.

 
Nahoru Odpovědět 28.10.2013 12:38
Avatar
Gramli
Redaktor
Avatar
Gramli:

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
Nahoru Odpovědět 29.10.2013 8:14
Kdo to říká ten to je...
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Gramli
noName:

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 InitializeCom­ponent(). Děkuji.

 
Nahoru Odpovědět 29.10.2013 9:29
Avatar
Theodor Johnson
Redaktor
Avatar
Odpovídá na noName
Theodor Johnson:

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

Nahoru Odpovědět 29.10.2013 9:35
Přecházím na "Cross-Platform Development"
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na noName
David Čápka:

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é.

Nahoru Odpovědět  +1 29.10.2013 10:21
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Gramli
noName:

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é?

 
Nahoru Odpovědět 30.10.2013 14:09
Avatar
Andrej Farkaš:

Myslím si, že najlepšie bude to vyriešiť tak ako píše sdraco cez graphics.

Nahoru Odpovědět 30.10.2013 15:54
Live. Love. Learn.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

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.

 
Nahoru Odpovědět 30.10.2013 15:55
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

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.

 
Nahoru Odpovědět 30.10.2013 15:55
Avatar
Motlja
Člen
Avatar
Motlja:

Nebo to mít komplexně v jednom pB a aby jsi to mohl rozkliknout tak si budeš hlídat x a y souřadnice

Nahoru Odpovědět 30.10.2013 15:59
Umím a učím se to co chci, to co mě baví a zajímá!!
Avatar
Josef Kuchař (Pepa489):

Jak říká sdraco, udělej to přes Graphics.

Nahoru Odpovědět 30.10.2013 16:36
2x piš, jednou debuguj
Avatar
Gramli
Redaktor
Avatar
Gramli:

Asi to nebude ideální řešení, ale metodu InicializeCom­ponent() 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í.

Editováno 30.10.2013 16:39
Nahoru Odpovědět 30.10.2013 16:38
Kdo to říká ten to je...
Avatar

Neregistrovaný
Avatar
Odpovídá na David Čápka
:

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ů...

 
Nahoru Odpovědět 30.10.2013 16:45
Avatar
Odpovídá na noName
Jakub Lásko[Saarix]:

Ještě by nebylo špatné zvážit využítí WPF, protože tam je vykreslování 5x-10x rychlejší.

Nahoru Odpovědět 30.10.2013 16:45
Časem je vše možné.
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Jakub Lásko[Saarix]
noName:

Ve WPF jsem zatím panic :D

 
Nahoru Odpovědět 30.10.2013 17:01
Avatar
Odpovídá na noName
Jakub Lásko[Saarix]:

Je to skoro úplně to samé a jsou tam třeba nové vychytané komponenty.

Nahoru Odpovědět 30.10.2013 18:30
Časem je vše možné.
Avatar
noName
Neregistrovaný
Avatar
Odpovídá na Jakub Lásko[Saarix]
noName:

A kdy tedy používat WF a kdy WPF? Je na to nějaké pravidlo?

 
Nahoru Odpovědět 30.10.2013 19:43
Avatar
Odpovídá na noName
Jakub Lásko[Saarix]:

Nejčastěji by se dalo říči toto: Když chceš vykreslovat (rychle) použij WPF, jinak stačí WP.

Nahoru Odpovědět  +1 30.10.2013 19:45
Časem je vše možné.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jakub Lásko[Saarix]
Kit:

Ještě znám jedno pravidlo: Pokud je něco pomalé, odeber zbytečné komponenty.

Nahoru Odpovědět  +1 30.10.2013 19:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na noName
Jan Vargovský:

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ší.

 
Nahoru Odpovědět 30.10.2013 19:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 30 zpráv z 30.