WPF zastavenie ProgressBar-u   zodpovězená otázka

C#, WPF

Dobrý večer.

Mám tlačítko po stlačení ktorého sa spustí ProgressBar, načítavanie z databázy, zobrazenie obrázkov a iné činnosti. Ako mám zastaviť progressBar, keď sú všetky tieto činnosti ukončené?

   private void button1_Click(object sender, RoutedEventArgs e)
        {
            CircularProgressBar pb =
                this.FindName("PB7") as CircularProgressBar;

            if (pb != null)
            {
                pb.Visibility = Visibility.Visible;
            }
           NacitajDtb();
           ZobrazObr();
           CitajData();


                if (Neviem čo)//Ak sa všetky činnosti ukončia
                {

                    pb.Visibility = Visibility.Hidden;
                
                }

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

Nestačilo by nastavit

pb.Value = 100;

?

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

Ďakujem za odpoveď.

Nestačilo. Je to dosť nešťastne položená otázka. ProgressBar zabezpečuje iná trieda. Je to nedeterminovabý PprogressBar. Spúšťa sa pb.Visibility = Visibility.Visible; a zastavuje pb.Visibility = Visibility.Hidden.

Doležité pre mňa je zistiť, kedy sú už všetky procesy medzi týmito dvoma príkazmi ukončené.

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

Nešlo by dát to "pb.Visibility = Visibility.Hidden" na konec té poslední procedury?

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

Nešlo. ProgressBar ukončí, ale niektoré činnosti nie sú ešte ukončené.(napr. načítanie obrázkov)

Pôvodne som aj ja rátal s tým, že to takto bude fungovať.

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

Nějak to nechápu, podle něčeho se přece ten progressbar musí plnit, tak až bude "ta" akce hotová, progressbar skončí, ne?

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

Volá sa ProgressBar, ale v skutočnosti je to indikátor behu procesov. Až sa procesy ukončia, tak indikátor treba vypnúť. Otáčavé guličky, aké bežia pri prehrávaní videi z internetu.

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

Jsem z toho srnec, daněk, jelen... Pak už jedině do každého procesu nacpat nějakou proměnnou, která bude indikovat, jestli je hotovo, průběžně ji kontrolovat a podle toho pak vypnout PB.

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

Ďakujem.

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

Při použití komponenty BackgroundWorker by se toto dalo ošetřit v události BackgroundWorker_Completed, protože ta se spustí ve chvíli, kdy BW svoji práci dokončí... Bylo by to i pro UI pohodlnější, bo by se činnost vykonávala na pozadí a nezatěžovala by hlavní vlákno...

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

Já se právě domnívám, že problém je v tom, že ty metody NacitajDtb(), ZobrazObr() a CitajDat() už teď dané akce pouze spouštějí na pozadí a proto akce provedené na konci metody button1_Click proběhnou dávno předtím, než jsou spouštěné akce dokončené. Pokud tomu tak není, nechápu v čem je problém.

Jinak komponenta BackgroundWorker vznikla v době Windows Forms dávno předtím než dnešní Task, CancellationToken, IProgress<T> a klíčová slova async/await, takže její používání dnes již nemá význam.

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

Nevidím důvod, proč nepoužívat BackgroundWorker. Její použití výrazně usnadňuje práci s vlákny a hlavně synchronizaci s hlavním vláknem...

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

Takže předpokládám, že ty "věci" NacitajDtb(), ZobrazObr() a CitajData() vám pouze spouštějí nějakou práci na pozadí (asynchronní operace nebo v backgroud treadu)? Dejte sem ukázku jak to tam máte.

V takovém případě je správné řešení použití klíčových slov async a await, ukázka:

private async void button1_Click(object sender, RoutedEventArgs e)
{
    var pb = (CircularProgressBar)this.FindName("PB7");

    pb.Visibility = Visibility.Visible;
    button1.IsEnabled = false;     //Zablokování UI
    try
    {
        await Task.WhenAll(
            NacitajDtbAsync(), 
            ZobrazObrAsync(),
            CitajDataAsync());
    } 
    finally
    {
        pb.Visibility = Visibility.Hidden;
        button1.IsEnabled = true;   //Odblokování UI
    }
}

private async Task NacitajDtbAsync()
{
    //např:
    //...
    //var result = await query.ToListAsync();
    //nebo
    //await file.ReadAsync();
    //nebo
    //await Task.Run(() => DoCPUWork());
}

private void DoCPUWork() { /*...*/ }
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Všetky riešenia vyhovujú.

Ďakujem.

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