Diskuze: c# winform form ztráta focusu

C# .NET .NET (C# a Visual Basic) c# winform form ztráta focusu American English version English version

Avatar
petr.chatar.anton:

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. dubna 15:55
Avatar
Odpovídá na petr.chatar.anton
Petr Štechmüller:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 28. dubna 16:46
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na petr.chatar.anton
Michal Štěpánek:

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

Nahoru Odpovědět 28. dubna 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:

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. dubna 9:44
Avatar
Odpovídá na Petr Štechmüller
petr.chatar.anton:

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. dubna 9:51
Avatar
hj.masek
Člen
Avatar
Odpovídá na petr.chatar.anton
hj.masek:

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. dubna 9:52
Avatar
 
Nahoru Odpovědět 29. dubna 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.