Diskuze: wpf: Int zvětšující se v závislosti na čase

C# .NET .NET (C# a Visual Basic) wpf: Int zvětšující se v závislosti na čase American English version English version

Avatar
Karel Panský:

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. října 20:57
Avatar
Nahoru Odpovědět  +1 10. října 20:59
:)
Avatar
jackx
Člen
Avatar
Odpovídá na Karel Panský
jackx:

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. října 22:43
Nic není nemožné.
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Karel Panský
ostrozan:

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

 
Nahoru Odpovědět 10. října 22:55
Avatar
jackx
Člen
Avatar
Odpovídá na Karel Panský
jackx:

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