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í.
Avatar
krepsy3
Tvůrce
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
Tvůrce
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
Tvůrce
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
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
krepsy3
Tvůrce
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
Tvůrce
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
Počkej chvíli, poradím se s křišťálovou koulí.
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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
10.7.2016 15:18
Veni, vidi, programmato
Avatar
krepsy3
Tvůrce
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.