Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Časování ve WPF

C# .NET .NET (C# a Visual Basic) Časování ve WPF American English version English version

Aktivity (1)
Avatar
krepsy3
Redaktor
Avatar
krepsy3:9.7.2016 23:51

Ahoj, potřeboval bych poradit. Ve WPF aplikaci projíždím několik průběhů smyčkou a na konci každého průběhu ji potřebuji pozastavit. Během průjezdů smyčkou se ale i průběžně aktualizuje UI, takže bohužel

Thread.Sleep()

mi nepomůže. Zkoušel jsem googlit, kloudnou odpověď i s vysvětlením jsem bohužel nenašel, ale tuším, že nejlepší by to asi bylo přes třídu Timer. Znáte-li ji, prosím poraďte, díky moc ;)

Odpovědět 9.7.2016 23:51
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na krepsy3
Michal Štěpánek:10.7.2016 0:45

Myslím, že BackgroundWorker by ti mohl pomoct...

Nahoru Odpovědět 10.7.2016 0:45
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na krepsy3
ostrozan:10.7.2016 8:15

BackgroundWorker je dobrý pro nějaký asynchronní proces, který nabízí navíc možnost sledovat jeho průběh.
Tobě ale nejspíš postačí ten jednodušší Timer.
Záleží ale na tom, jak to máš postavené.

 
Nahoru Odpovědět 10.7.2016 8:15
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:10.7.2016 8:22

V první řadě bych ze smyčky vyhodil to, co chce čekat a nechal jenom update UI. To, co chce čekat dej do vedlejší funkce. Pak už je jenom na tobě, jestli ji budeš volat v timeru, nebo tam dáš sleep a uděláš z toho druhé vlákno.

Nahoru Odpovědět 10.7.2016 8:22
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
krepsy3
Redaktor
Avatar
krepsy3:10.7.2016 11:05

Dobře. Více vláken nechci, jednak s tím zatím neumím pracovat a druhak je to zbytečné pro takto jednoduchou aplikaci. Také nevím, co je backgroundWorker, mohl by mi to prosím někdo osvětlit? Popř. i se zdrojákem?

Smyčka vlastně simuluje průběh jakési "hry", kde je určitá šance na výhru a určitá šance na prohru. Tím, že hru udělá třeba 10 000 krát, dokáže opravdovou pravděpodobnost prohry a výhry. Potřebuju ale, aby se po každé hře updatovalo UI, kde se přičte výhra či prohra do TextBlocku. Po tomto updatování by měla čekat v řádu milisekund, než pojede znova. A Thread.Sleep() bohužel neupdatuje to UI, ale vše se projeví až po dokončení smyčky.

Nahoru Odpovědět 10.7.2016 11:05
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na krepsy3
Michal Štěpánek:10.7.2016 11:56

BackgroundWorker lze pochopit z tohodo videa
https://channel9.msdn.com/…msaplikacich

i já jsem to z toho pochopil, a to je co říct...

Nahoru Odpovědět 10.7.2016 11:56
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na krepsy3
Adam Ježek:10.7.2016 12:24

Pokud bude hlavní vlakno zaneprazdněno, tak se UI obnovovat nebude. Udělat z jedné funkce vedlejší vlakno je zaležitost pár řádků navíc. http://www.itnetwork.cz/…ych-aplikaci

Editováno 10.7.2016 12:25
Nahoru Odpovědět 10.7.2016 12:24
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
D0ll0k
Člen
Avatar
D0ll0k:10.7.2016 15:18

Zkus pouzit DispatcherTimer (System.Window­s.Threading.Dis­patcherTimer). DispatcherTimer opakovane ve zvolenem case vola metodu, kde muzes manipulovat s kontrolkami, ktere se pak updatuji. Musis mu nastavit tyto vlastnosti:

DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimerTick); // do parametru das jmeno metody, ktera se ma volat
dispatcherTimer.Interval = new TimeSpan(0, 0, 10); //interval, ve kterem se opakovane vola metoda (v tomto pripade kazdych deset vterin)
//vice o timespanu zde: https://msdn.microsoft.com/cs-cz/library/system.timespan(v=vs.110).aspx

Metoda musi mit dva parametry object a EventArgs:

private void dispatcherTimerTick(object sender, EventArgs e) {}

Pomoci:

dispatcherTimer.Start();

ho spustis. Pak s:

dispatcherTimer.Stop();

se zastavi.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 10.7.2016 15:18
Veni, vidi, programmato
Avatar
krepsy3
Redaktor
Avatar
krepsy3:10.7.2016 16:16

Aha, čili ten timer použiju MÍSTO smyčky, kterou bych pauzoval. A kód tedy zapíšu přímo do metody dispatcherTimer­Tick(). Přesně tenhle kód jsem taky našel, ale nepochopil jsem ho. Díky moc za vysvětlení ;)

Nahoru Odpovědět 10.7.2016 16:16
Programátor je stroj k převodu kávy na kód.
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 9 zpráv z 9.