Diskuze: Časování ve WPF
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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é.
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.
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.
BackgroundWorker lze pochopit z tohodo videa
https://channel9.msdn.com/…msaplikacich
i já jsem to z toho pochopil, a to je co říct...
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
Zkus pouzit DispatcherTimer (System.Windows.Threading.DispatcherTimer). 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.
Aha, čili ten timer použiju MÍSTO smyčky, kterou bych pauzoval. A kód tedy zapíšu přímo do metody dispatcherTimerTick(). Přesně tenhle kód jsem taky našel, ale nepochopil jsem ho. Díky moc za vysvětlení
Zobrazeno 9 zpráv z 9.