Avatar
Libor Šimo (libcosenior):

Č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
Redaktor
Avatar
Juraj Mlich:

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  +2 31.8.2013 9:12
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Juraj Mlich
matesax:

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  -4 31.8.2013 9:20
Avatar
Juraj Mlich
Redaktor
Avatar
Odpovídá na matesax
Juraj Mlich:

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
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
matesax
Redaktor
Avatar
Odpovídá na Juraj Mlich
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
Juraj Mlich:

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

Nahoru Odpovědět 31.8.2013 10:14
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
Juraj Mlich
Redaktor
Avatar
Juraj Mlich:

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
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
Odpovídá na matesax
Luboš Běhounek (Satik):

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  +2 31.8.2013 10:50
:)
Avatar
Libor Šimo (libcosenior):

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

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

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
:)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Luboš Běhounek (Satik)
David Čápka:

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  ±0 31.8.2013 11:10
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Luboš Běhounek (Satik):

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
:)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Luboš Běhounek (Satik)
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):

Ď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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

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

Nahoru Odpovědět 31.8.2013 11:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Libor Šimo (libcosenior):

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  -1 31.8.2013 13:35
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na David Čápka
Jiří Košata (kosata50):

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 Čápka
Jiří Košata (kosata50):

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

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ý
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jan Vargovský:

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

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

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

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

Nahoru Odpovědět 1.9.2013 13:47
:)
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.