VS 2010 Visual Basic - předávání řízení, Focus   zodpovězená otázka

VB.NET, Visual Studio, Algoritmy, WinForms

Dobrý den.

Vytvořil jsem si program na kopírování souborů. Mám však problém. Když kopíruji dlouhé soubory (filmy atd.) tak program nereaguje na příkazy kde vypisuji, který soubor se momentálně kopíruje.

Př.

.

.

.

tbPokec.Text = "Kopíruje se " & poc & "/" & celkem

FileSystem.CopyFile(zdroj, cil, overwrite:=True)

.

.

.

Zobrazení tbPokec.Text se v průběhu kopírování nemění. Vypadá to, že funkce textovému poli vlastně nedá Focus. Mělo by se vlastně objevit třeba

Kopíruje se 13/26

To samé je, když použiji ProgressBar. ProgressBar se ani nehne a v Me.Text se objeví (Neodpovídá), i když kopírování pokračuje.

Děkuji za jakoukoliv radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste se podívat na komponentu BackGroundWorker, to je myslím to, co Vám pomůže...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já už jsem na to přišel. Úplně jsem zapomněl na příkaz Application.DoEvent. Ještě jednou se vám omlouvám.

Jeništa

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ApplicationDoEvent není uplně to pravé ořechové. Pořád totiž vykreslování Vašeho okna a kopírování běží v jednom vlákně. To znamená že pokud myší chytnete za okno a budete ho přesouvat sem a tam tak se sice všechno vykreslí, ale po dobu vykreslování se Vám nebudou kopírovat soubory (v jednou chvíli se bude dělat jedno nebo druhé).

Podívejte se na již zmiňovaný BackgroundWorker. Pomocí něj spustíte kopírování v samostatném vlákně, takže Vám to pak vykreslování UI nebude brzdit (celkově by se měl chod vaší aplikace zrychlit, jak moc to bude záležet na tom jak často vypisujete nový text do textboxu a samozřejmě jak moc hýbete s oknem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za radu. DoEvent používám v programu kopírování a zálohování. V obou případech používám ProgressBar a výpis procenta hotové práce a v případě zálohy ještě vypisuji právě zpracovávanou cestu (do TextBoxu). Oknem nijak nepohybuji, maximálně jej minimalizuji. Jak jsem si nově upravené programy vyzkoušel, tak vše funguje a i práce se trošku zrychlila. Myslím si, že BackgroundWorker by byl na místě při práci s grafikou nebo při zpracování velkého množství dat. Díval jsem se na tento příkaz a nejsem z něj dvakrát chytrej.

Jinak děkuji.

Jeništa.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

BackgroundWorker je komponenta vhodná na akce, které trvají déle než 3 sekundy, protože pokud uživateli "zamrzne" aplikace na delší dobu, obvykle to nedopadá dobře. Na mstv.cz je udělaný "videonávod", jak s touto komponentou zacházet. Pochopil jsem to z toho i já (a to je co říct) a od té doby ji hojně využívám...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak jsem program překopal a použil BackgroundWorker. Musel jsem tam vložit Control.CheckForIllegalCrossThreadCalls = False, abych nemusel program komplet rozložit a složit jinak. Pro pokus jsem použil kopírovací program. Vše chodí, oknem pohybuji atd. Mám však jeden problém. Na konci programu dělám konečný přehled, kde je cílový adresář, velikost disku, počet souborů, velikost dat atd. K tomu používám druhé okno (Form2), které jsem po naplnění proměnné volal KopirakSouhrn.Show(). Nechtěl jsem použít MsgBox, protože ten má tradiční barvu a moc se na něm nedá měnit. Tady mně to však přestává chodit. Proměnnou naplním, okno se otevře, ale nic v něm není. Když nad okno dám kurzor, tak se změní na točící se kolečko a čeká na něco. Podle mě musím to vlákno nějak ukončit, abych mohl pracovat s hlavním vláknem. Hledal jsem na internetu, shlédl jsem asi desetkrát vytváření ProgressBaru, ale program, kde jsou použita dvě okna, tam prostě není. Nemůžete mně někdo poradit nebo nasměrovat?

Děkuji.

Jeništa.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A kdy to "nové okno" otevíráte, resp. v kterém kroku toho backgroundworkeru? Vlákno BackgroundWorkeru, nebo spíš jeho akce je ukončena "v události" RunWorkerCompleted a tam už jste zpět v hlavním vlákně...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dík. Tak už to chodí kompletně tak, jak to chodit má.

Jeništa.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback