Avatar
Karel Panský:10.10.2016 20:57

Ahoj, prosím o radu. Snažím se vytvořit takovou jednoduchou "hru" na princip browsterovek. Potřeboval bych vědět, jak vytvořit proměnnou, která se bude každou sekundu zvětšovat o 1. Vypisovat jí pak chci v labelu. Problém je v tom, že když tu proměnnou nastavím a dám výpis v labelu, tak se mi program sekne, dokud nedoběhne. Což můžete vidět v kódu níže (je mi jasný, že to dělá ten thread.sleep). Tato metoda je funkční, ale v tomhle případě nepoužitelná. Potřebuju něco, co bude běžet pořád bez toho, aby na ní muselo celé vlákno čekat. Mohl by mi tady někdo poradit, jak na to?

PS: dělám to spíše jako koníčka, jsem začátečník, tak prosím o trošku trpělivosti. :)

private void Window_Activa­ted(object sender, EventArgs e)
{
int i = 0;
while (i < 300)
{
i++;
Thread.Sleep(1);
}

Dřevo.Content = i;
}

 
Odpovědět 10.10.2016 20:57
Avatar
Luboš Běhounek (Satik):10.10.2016 20:59

Timer

Nahoru Odpovědět  +1 10.10.2016 20:59
:)
Avatar
jackx
Člen
Avatar
Odpovídá na Karel Panský
jackx:10.10.2016 22:43

Problem je, ze to jede v jednom vlakne a ty to vlakno uspavas... Mrkni sem: http://www.itnetwork.cz/…-pomoci-uloh

Nahoru Odpovědět 10.10.2016 22:43
Nic není nemožné.
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Karel Panský
ostrozan:10.10.2016 22:55

Luboš byl až příliš stručný - takže znova :
vše co potřebuješ je Timer

 
Nahoru Odpovědět 10.10.2016 22:55
Avatar
jackx
Člen
Avatar
Odpovídá na Karel Panský
jackx:11.10.2016 7:21

Timer je dobrý nápad, ale já byt to řešil asi takto:-)
Nezapomen uplne nahoru pridat using:

using System.Threading.Tasks;
public partial class MainWindow : Window
    {
        // definice promenne
        int i = 0;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Activated(object sender, EventArgs e)
        {
            // po aktivaci okna spustim odpocet
            Odpocet();
        }

        /// <summary>
        /// odpocet
        /// </summary>
        private void Odpocet()
        {
            // toto vytvori ulohu, ktera neblokuje hlavni vlakno a ktera po uplynuti 1000ms (1s) spusti metodu Refresh()
            Task.Delay(1000).GetAwaiter().OnCompleted(() => Refresh());
        }
        /// <summary>
        /// refresh
        /// </summary>
        private void Refresh()
        {
            // navysim i o 1 (jde to taky zapsat takto i = i+1;
            i++;
            // aktualizuji label (nauc se psat nazvy prvku bez diakritiky a idealne k nim pridavat i typ prvku...)
            drevoLabel.Content = i;
            // znovu spustim odpocet :-)
            Odpocet();
        }
    }

Časem zjistíš, že to není úplně nejpřesnější, zvláště když budeš před voláním Odpocet() provádět mnoho dalších operací.
Až budeš zkušenější, budeš to zkusit vyřešit pomocí vlastnosti Ticks :-)

Nahoru Odpovědět  -1 11.10.2016 7:21
Nic není nemožné.
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 5 zpráv z 5.