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!
Avatar
petr.chatar.anton:28.4.2016 15:55

Ahoj, z formu spouštím tlačítkem kód, který provádí časově náročnější operace. Aby bylo vidět, že se něco děje, rád bych na formu do textboxu vypisoval informace o průběhu. Jakmile ten kód běží, text do textboxu sice nastavuje, ale na formu se mi to neukazuje - ten nejspíš ztratil focus, není aktivní. Nejdou mi na něm ani hodiny, které řídí timer. To vše se obnovíaž po doběhnutí kódu, samozřejmě, že v textboxu je poslední zpráva, kterou jsem tam vypsal.
Prosím Vás o radu, jak se tohle dá ošetřit.
Děkuju.

 
Odpovědět
28.4.2016 15:55
Avatar
Odpovídá na petr.chatar.anton
Petr Štechmüller:28.4.2016 16:46

Ahoj, jednoduchá otázka: provadíš ty časově náročné operace v jiném vlákně? Pokud všechno jedes ve stejném vlákně jako UI, tak se nemůžeš divit, ze se Ti i timer zasekne, když to ma co dělat, aby to upočítalo.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.4.2016 16:46
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na petr.chatar.anton
Michal Štěpánek:28.4.2016 17:04

To je logické chování. Použij na tu "operaci" BackgroundWorker a bude to šlapat, jak má...

Nahoru Odpovědět
28.4.2016 17:04
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Petr Štechmüller
petr.chatar.anton:29.4.2016 9:44

Díky za pomoc. Zkusil jsem to s jiným vláknem, ve VisualStudiu mi to ale zahlásilo chybu "Operace mezi vlákny není platná: Přístup k ovládacímu prvku textBoxInfo proběhl z jiného vlákna než z vlákna, v rámci kterého byl vytvořen." Když ale program spustím přímo, jako aplikace.exe z adresáře Debug projektu, aplikace běží normálně, chybu žádnou nevyhodí, Textbox se vypisuje i v průběhu běhu toho vlákna. Na BackgroundWorker moje znalosti zatím nestačí .....

 
Nahoru Odpovědět
29.4.2016 9:44
Avatar
Odpovídá na Petr Štechmüller
petr.chatar.anton:29.4.2016 9:51

Tak nic, řešení jsem už našel.

public void nastavTextInfo(string text)
        {
           this.Invoke((MethodInvoker)delegate
           {
               textBoxInfo.Text = text;
           });
        }
 
Nahoru Odpovědět
29.4.2016 9:51
Avatar
hj.masek
Člen
Avatar
Odpovídá na petr.chatar.anton
hj.masek:29.4.2016 9:52

Aby jsi se dostal k UI prvkum musis je invoknout

label1.Invoke((Action)delegate {
                   //operace jako nastaveni textu atd
               });

pak bys nemel mit problem s cross thread

 
Nahoru Odpovědět
29.4.2016 9:52
Avatar
Odpovídá na hj.masek
petr.chatar.anton:29.4.2016 9:54

No, kvoknul jsem je ..... :-D

 
Nahoru Odpovědět
29.4.2016 9:54
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 7 zpráv z 7.