Avatar
krepsy3
Redaktor
Avatar
krepsy3:

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. července 23:51
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na krepsy3
Michal Štěpánek:

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

Nahoru Odpovědět 10. července 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:

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. července 8:15
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

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. července 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:

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. července 11:05
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na krepsy3
Michal Štěpánek:

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. července 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:

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. července 12:25
Nahoru Odpovědět 10. července 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:

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. července 15:18
Ten, co se snaží "programovat"
Avatar
krepsy3
Redaktor
Avatar
krepsy3:

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. července 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.