Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vícevláknové WPF - přístup ke kontrolkám

Aktivity
Avatar
ZuLeweiner
Člen
Avatar
ZuLeweiner:1.7.2015 10:38

Zdravím, potřeboval bych polopatě vysvětlit, jak můžu z druhého pracovního vlákna přistupovat ke kontrolce, kterou založilo hlavní vlákno (konkrétně potřebuju aktualizovat progressbar). Je tedy lepší použít Control.Invoke nebo progressbar vytvořit až za běhu aplikace?

Předem díky za vysvětlení.

 
Odpovědět
1.7.2015 10:38
Avatar
vodslon
Člen
Avatar
Odpovídá na ZuLeweiner
vodslon:1.7.2015 12:02

Ahoj, já se snažím mít oddělené UI od kodu, takže mám kontrolku už mám připravenou a data do ní z jiného vlákna vkládám pomocí Dispacher.Begi­nInvoke().

 
Nahoru Odpovědět
1.7.2015 12:02
Avatar
ZuLeweiner
Člen
Avatar
Odpovídá na vodslon
ZuLeweiner:1.7.2015 15:08

http://www.itnetwork.cz/dev-lighter/615

Snažím se, aby pracovní vlákno postupně aktualizovalo progressbar a hlavní vlákno se mohlo soustředit na případné mačkání tlačítek. Když ale spustím tenhle kód, progressbar se neaktualizuje průběžně, ale až na konci činnosti se zobrazí celý vybarvený, navíc v průběhu činnosti jsou všechna tlačítka (takže celé hlavní okno) neaktivní.

Ono to asi, hádám, bude tím, že druhé vlákno musí nějak uspat to první, aby mohlo pracovat s jeho kontrolkou, proto mi ta forma nereaguje. Můžeš mi sem případně postnout svůj kód, jak to děláš ty, nebo popsat nějak konkrétněji?

 
Nahoru Odpovědět
1.7.2015 15:08
Avatar
vodslon
Člen
Avatar
Odpovídá na ZuLeweiner
vodslon:1.7.2015 16:02
for (int i = 0; i < 100; i++)
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    progressBar.Value += 10;

                }));
                Thread.Sleep(1000);
            }

Ta metoda musí být takto, já to umím říct jenom laicky, ale to BeginInvoke() padne zpátky na vlákno, které se stará o ProgressBar.
Takže Když tam pak máš pořád zapisování do toho progressbaru tak si ho zamkneš. Takže to má být jeden cyklus zapsat novou hodnotu počkat další cyklus...

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
1.7.2015 16:02
Avatar
Odpovídá na ZuLeweiner
Michal Štěpánek:2.7.2015 8:53

Myslím, že na toto se nejlépe hodí BackGroundWorker

Nahoru Odpovědět
2.7.2015 8:53
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vodslon
Člen
Avatar
Odpovídá na Michal Štěpánek
vodslon:2.7.2015 9:27

Myslím, že je to zbytečně složité si tam dávat další třídu navíc co se o to bude starat, pokud se to chce jenom učit. Ale určitě je dobré se do budoucna na BackGroundWorker podívat. Je to šikovná věc.

 
Nahoru Odpovědět
2.7.2015 9:27
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 6 zpráv z 6.