NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C# WF - přístup k prvkům na formuláři z jiného vlákna

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

Aktivity
Avatar
Adam Ježek
Tvůrce
Avatar
Adam Ježek:12.4.2015 20:43

Ahoj,
mám WF aplikaci a v ni vytvořené vlákno

Thread vlakno = new Thread(odpalTo);

ale když se z něj pokusim upravit něco na formuláři, tak to skončí s chybou. Ve WPF to stačilo zabalit do Dispatcher,Invoke, ale ten ve WF očividně neni.
Jak to udělat ve WF? A nejlépe do toho zabalit celé vlákno, abych nemusel každé label1.Text = "asdgfgh"; zabalovat do nějakého bloku.
Díky

Odpovědět
12.4.2015 20:43
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:12.4.2015 21:06

jen zavoláš Invoke na tom labelu. Btw, když bys měl předat celou práci na to vlákno, tak to už nemusíš zakládat nové :D

Editováno 12.4.2015 21:08
 
Nahoru Odpovědět
12.4.2015 21:06
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Adam Ježek:12.4.2015 21:09

TO vlákno bude běžet asi hodinu, a já bych mezitim rád měl funkční zbytek :D btw, ten invoke na to zavolam jak?

Nahoru Odpovědět
12.4.2015 21:09
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:12.4.2015 21:21

Úplně stejně jako s tím dispatcherem.

Thread t = new Thread(Metoda);
t.Start();

private void Metoda()
{
    for (int i = 0; i < 10; i++)
    {
        label1.Invoke(new Action(() => label1.Text = i.ToString()));
        Thread.Sleep(500);
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.4.2015 21:21
Avatar
Adam Ježek
Tvůrce
Avatar
Nahoru Odpovědět
12.4.2015 21:22
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:12.4.2015 21:31
Thread t = new Thread(Metoda);
t.Start();

private void Metoda()
{
    for (int i = 0; i < 10; i++)
    {
        label1.Invoke(new Action<int>(Change), i);
        Thread.Sleep(500);
    }
}

private void Change(int obj)
{
    label1.Text = obj.ToString();
}

Správně by to mělo být asi takto, aby ses zbytečně neodkazoval na jiný kontext.

 
Nahoru Odpovědět
12.4.2015 21:31
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 6 zpráv z 6.