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é?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

1
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

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