Diskuze: Timer alebo Sleep
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 24 zpráv z 24.
//= 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.
Myslím že tá možnosť s timerom pretože v druhej možnosti uspíš celé vlákno a gui ti nebude reagovať (aplikácia sa bude správať ako keby zamrzla).
A co Timer vlákna? Tedy v System.Threading máš Timer, co ti jede jako vlastní vlákno. Totéž by šlo i s tím Sleepem. (Není náhoda, že se to taktéž nachází Threading) Otázkou je tedy, zda-li chce pracovat s celými vlákny... (Ve skutečnosti Timer jede vždy v nějakém vlákně - je to samostatný subproces.)
Timer je něco, co jede stále ve stejném intervalu - a počítáme s tím dlouhodobě. Sleep poskytuje snadnou možnost kdykoliv utéci a kdykoliv měnit prodlevu. (U Timeru to je složitější...)
Ja viem...Ale keď uspíš podproces na ktorom beží to okno (form) tak sa aplikácia bude správať ako zamrznutá.
Ja myslím že to okno bude označené (windowsom) ako neodpovedá. Nemyslel som to tak že sa uspia všetky vlâkna.
System.Windows.Forms.Timer, který se defaultně v WinForms používá, běží ve stejném vlákně jako Form.
Pokud těch 200ms lag není moc, tak bych klidně ten čekací cyklus po kliku na tlačítko, případně ho upravil takhle:
for (int i = 0; i < 6; i++)
{
for (int j=0; j<4; j++) // nebylo by od věci tenhle cyklus hodit do samostatne funce typu cekej(int interval)
{
System.Threading.Thread.Sleep(50);
Application.DoEvents();
}
HodKockou();
}
50ms už uživatel nejspíš nepozná (těch 200ms by ještě mohl postřehnout).
Díky za názory. Ešte by ma zaujímal názor sdraco, pretože on mi stále radil vo všeobecnosti Timer.
Obidve možnosti pracujú pri spustení aplikácie identicky. Navyše ja potrebujem v tej momente len to, aby sa hádzala kocka, žiadna iná činnosť sa nevykonáva.
Pokud předem nevíš, kolikrát se ta akce bude opakovat nebo jich má běžet víc najednou, tak bych použil Timer, pokud běží jen jedna po kliku na tlačítko a má se spustit jen několikrát, tak Timer není potřeba a s klidem bych to udělal přes to tlačítko (a sleep + předání řízení zpět formu).
Pro začátečníka je Timer jednodušší v tom, že nemusí umět používat Thread.Sleep() a Application.DoEvents().
Timer je jediné správné řešení, protože funguje na principu událostí. WinForms jsou tak navržené, volání něčeho takového v cyklu jsou jen návyky z konzole, které sem již nepatří.
Když budeš potřebovat, aby se událost stala po kliku na tlačítko a pak ještě jednou po jedné vteřině, tak kvůli tomu taky budeš vytvářet na to Timer?
Ano, pokud potřebuješ vteřinu čekat, uděláš si k tomu Timer, nevidím na tom nic divného, tak je ten FW navržený.
Ďakujem, presne toto ma zaujímalo.
Již jsem ti to tu několikrát přeci říkal.
Máš pravdu, ale ako vidíš, sú tu aj oveľa skúsenejší ako ja a
pochybujú.
Potvrdil si to a keď to tu pár členov prečítalo, budú si v tom istí.
Opakovanie je matka múdrosti.
Nebylo by na tohle čekání jednodušší použít async a await? Nebo se to sem nehodí?
Jenom ještě dodám, že jsem měl na mysli něco takového:
async private void pbxKocka_Click(object sender, EventArgs e)
{
for (int i = 0; i < 6; i++)
{
await Task.Delay(200);
HodKockou();
}
}
Timer bych použil až teprve, kdyby bylo nutné cílit na nižší verzi
.NET Frameworku
Mňa už sdraco presvedčil, že Timer je pre WinForm ideálny, je jeho súčasťou. Pozeral som na nete aj async a await, ale ako príklad je tam použitie v konzole. Timer (myslím) sa dá použiť len vo WinForm.
Když si přidáš referenci, tak jde použít i v consoli.
No mohl bys použit timer. Tak sámo jako v consoli si můžeš vytvořit nový form a pracovat s ním.
Timer z Formu by v konzolové aplikaci fungoval jen kdyby jsi tam zpracovaval frontu zprav.
Zobrazeno 24 zpráv z 24.