IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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
Libor Šimo (libcosenior):31.8.2013 9:08

Čo je vhodnejšie v aplikácii WinForm?

private int hody;
private void pbxKocka_Click(object sender, EventArgs e)
{
    hody = 0;
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    HodKockou();
    hody++;
    if (hody == 6)
        timer1.Stop();
}

alebo

private void pbxKocka_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 6; i++)
    {
        Application.DoEvents();
        System.Threading.Thread.Sleep(200);
        HodKockou();
    }
}
Odpovědět
31.8.2013 9:08
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Juraj Mlich
Tvůrce
Avatar
Juraj Mlich:31.8.2013 9:12

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).

 
Nahoru Odpovědět
31.8.2013 9:12
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Juraj Mlich
matesax:31.8.2013 9:20

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ší...)

Editováno 31.8.2013 9:21
 
Nahoru Odpovědět
31.8.2013 9:20
Avatar
Juraj Mlich
Tvůrce
Avatar
Odpovídá na matesax
Juraj Mlich:31.8.2013 9:34

Ja viem...Ale keď uspíš podproces na ktorom beží to okno (form) tak sa aplikácia bude správať ako zamrznutá.

Editováno 31.8.2013 9:35
 
Nahoru Odpovědět
31.8.2013 9:34
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Juraj Mlich
matesax:31.8.2013 10:08

Kdeže. Jedno vlákno může spát a další běžet...

 
Nahoru Odpovědět
31.8.2013 10:08
Avatar
Juraj Mlich
Tvůrce
Avatar
Odpovídá na matesax
Juraj Mlich:31.8.2013 10:14

Netvrdím že nie, asi si ma zle pochopil...

 
Nahoru Odpovědět
31.8.2013 10:14
Avatar
Juraj Mlich
Tvůrce
Avatar
Juraj Mlich:31.8.2013 10:15

Ja myslím že to okno bude označené (windowsom) ako neodpovedá. Nemyslel som to tak že sa uspia všetky vlâkna.

 
Nahoru Odpovědět
31.8.2013 10:15
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:31.8.2013 10:50

System.Window­s.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).

Editováno 31.8.2013 10:52
Nahoru Odpovědět
31.8.2013 10:50
https://www.facebook.com/peasantsandcastles/
Avatar
Libor Šimo (libcosenior):31.8.2013 10:57

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.

Editováno 31.8.2013 10:57
Nahoru Odpovědět
31.8.2013 10:57
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Juraj Mlich
Libor Šimo (libcosenior):31.8.2013 11:03

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.

Nahoru Odpovědět
31.8.2013 11:03
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek Satik:31.8.2013 11:05

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.Do­Events().

Nahoru Odpovědět
31.8.2013 11:05
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:31.8.2013 11:10

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ří.

Nahoru Odpovědět
31.8.2013 11:10
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:31.8.2013 11:16

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?

Nahoru Odpovědět
31.8.2013 11:16
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:31.8.2013 11:17

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ý.

Nahoru Odpovědět
31.8.2013 11:17
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Libor Šimo (libcosenior):31.8.2013 11:22

Ďakujem, presne toto ma zaujímalo. :)

Nahoru Odpovědět
31.8.2013 11:22
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Hartinger:31.8.2013 11:24

Již jsem ti to tu několikrát přeci říkal.

Nahoru Odpovědět
31.8.2013 11:24
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Libor Šimo (libcosenior):31.8.2013 13:35

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. 8-)

Nahoru Odpovědět
31.8.2013 13:35
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na David Hartinger
Jiří Košata - kosata50:31.8.2013 14:53

Nebylo by na tohle čekání jednodušší použít async a await? Nebo se to sem nehodí?

 
Nahoru Odpovědět
31.8.2013 14:53
Avatar
Odpovídá na David Hartinger
Jiří Košata - kosata50:1.9.2013 13:06

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 :)

 
Nahoru Odpovědět
1.9.2013 13:06
Avatar
Libor Šimo (libcosenior):1.9.2013 13:33

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.

Editováno 1.9.2013 13:33
Nahoru Odpovědět
1.9.2013 13:33
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jan Vargovský:1.9.2013 13:37

Když si přidáš referenci, tak jde použít i v consoli.

 
Nahoru Odpovědět
1.9.2013 13:37
Avatar
Odpovídá na Jan Vargovský
Libor Šimo (libcosenior):1.9.2013 13:40

Malo by to nejaký význam?

Nahoru Odpovědět
1.9.2013 13:40
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jan Vargovský:1.9.2013 13:45

No mohl bys použit timer. Tak sámo jako v consoli si můžeš vytvořit nový form a pracovat s ním.

 
Nahoru Odpovědět
1.9.2013 13:45
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek Satik:1.9.2013 13:47

Timer z Formu by v konzolové aplikaci fungoval jen kdyby jsi tam zpracovaval frontu zprav.

Nahoru Odpovědět
1.9.2013 13:47
https://www.facebook.com/peasantsandcastles/
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 24 zpráv z 24.