ProgressBar – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ProgressBar – .NET – Fórum – Programujte.comProgressBar – .NET – Fórum – Programujte.com

 

Frank
~ Anonymní uživatel
11 příspěvků
25. 5. 2019   #1
-
0
-

Ahoj, 


může mi prosím někdo poradit, proc se mi v kodu nize nerozjede ProgressBar?

Diky za odpověď.


private void button1_Click(object sender, EventArgs e)

        {
            progressBar1.Style = ProgressBarStyle.Marquee;
            progressBar1.MarqueeAnimationSpeed = 100;
            if (ComboBox1.SelectedIndex != -1)
            {
                List<object> Arguments = new List<object>();
                Arguments.Add(ComboBox.SelectedItem);
                Arguments.Add(TextBox.Text);
                Arguments.Add(TextBox.Text);
                backgroundWorker1.RunWorkerAsync(Arguments);
            }
        }

        private void DoWork(object sender, DoWorkEventArgs e)
        {
            List<object> GenericList = (List<object>)e.Argument;
            Object object = (Glass)GenericList[0];
            int cislo = GenericList[2].ToString() == string.Empty ? 1 : Convert.ToInt32(GenericList[2]);
            double jinecislo = GenericList[1].ToString() == string.Empty ? 0 : Convert.ToDouble(GenericList[1]);
            e.Result = Class2.Calculate(object, cislo, druhecislo);
        }

       private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            DataGridView.DataSource = (DataTable)e.Result;
            progressBar1.MarqueeAnimationSpeed = 0;

        }

Nahlásit jako SPAM
IP: 109.81.209.–
gna
~ Anonymní uživatel
1850 příspěvků
25. 5. 2019   #2
-
0
-

Není možné, že ti prostě ten worker skončí rychle?

Nahlásit jako SPAM
IP: 213.211.51.–
Frank
~ Anonymní uživatel
11 příspěvků
25. 5. 2019   #3
-
0
-

Ja myslim, ze ne. Nez se nactou data do tabulky trva pomerne dlouho. 

Nahlásit jako SPAM
IP: 109.81.209.–
jerry
~ Anonymní uživatel
504 příspěvků
26. 5. 2019   #4
-
0
-

#1 Frank
Backgroudworker je standardní vlákno jako jakékoliv jiné akorát že se menuje Backgroudworker. Nemuže se ti prg.bar. rozject protože prostě neni čas na obnovování při přepínání vláken - pokud je poloha naplnění správně že - to tu vidět neni. Co třeba ProgressBar.Step ?

https://docs.microsoft.com/cs-cz/dotnet/api/system.windows.forms.progressbar.step?view=netframework-4.8

Taky musíš někam vložit Application.DoEvents() asi do DoWork. a pak taky je potřeba dát ProgressBar.Refresh() a možná i vyvolat Refresh nadřazené komponenty. WinForms jsou komplikovaný. Já bejt tebou bych přešel z WinForms na WPF.

jinak ten tvuj zápis kodu:

int cislo = GenericList[2].ToString() == string.Empty ? 1 : Convert.ToInt32(GenericList[2]);
double jinecislo = GenericList[1].ToString() == string.Empty ? 0 : Convert.ToDouble(GenericList[1]);

to je fakt tragédie ... ty asi budeš mladší ročník co ? ty ses učil programovat někde z nějaký "moderní" učebnice co ? ...

1/ deklarace+definice proměnných je vždy zvlášť na začátku metody pokud k tomu nemáš zvláštní důvody.

2/ použití ? místo if je spíše otázka C/C++ a moc se nepoužívá protože se fakt blbě čte.

3/ GenericList[2].ToString() == string.Empty  ?? to je co ??? přeci si deklaroval že

List<object> Arguments = new List<object>(); ?? ne ?? a přitom tam dáváš různý objekty

ty děláš konverzi na string ??? to nechápu ... a co použít GetType() ??? tohle skončí katastrofou ...

4/ progress bar inicializace:

            this.progressBar2.Visible = true;
            this.progressBar2.Minimum = minLimit;
            this.progressBar2.Maximum = (Int32)maxLimit;
            this.progressBar2.Value = 1;
            this.progressBar2.Step = 1;
            this.progressBar2.Refresh();

progresbar ta část co určuje pozici posuvníku v cyklu:

                this.progressBar2.Value = (Int32)limit; // aktualni pozice
                this.progressBar2.PerformStep();
                this.progressBar2.Refresh();

a ještě drobnost .... používej MS VS 2019.

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:10a3:ccf5:8abe:2c56...–
gna
~ Anonymní uživatel
1850 příspěvků
26. 5. 2019   #5
-
0
-

#4 jerry
BackgroundWorker běží na pozadí v samostatném vlákně a UI neblokuje.

Marquee ProgressBar se spouští a zastavuje, ale nekrokuje, protože neindikuje konkrétní pozici.

Application.DoEvents je vždycky špatně. Dá se doporučit jen jako prasácká nouzovka ve stylu "to mu tady zatím stačí". Tady je to nesmysl.

Nahlásit jako SPAM
IP: 213.211.51.–
jerry
~ Anonymní uživatel
504 příspěvků
26. 5. 2019   #6
-
0
-

#5 gna, Frank
týjo .. taková kritika :)))))  DoEvents() není špatný .. ale musíš vědět JAK a hlavně KDE to použít. Zjednodušuje to kod, pokud ste odrostli na assembleru a znáte jak funguje procesor a dáte si disassebmlovat C# .NET kod uvidíte že doevents nedělá nic špatnýho ...zkuste si někdy spustit profiler, je mnohem horší mít "seklej" thread na pozadí než sem tam vložit intelignetně doevents. WinForms jako visuální prvky sou jednovlánkový ... i když rozdělíš chod na jiné vlákno stejně se čeká na zprávu z toho vlákna formou callbacku jinak se ti to sekne což je to co se ti stalo.

https://blog.codinghorror.com/is-doevents-evil/

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.application.doevents?redirectedfrom=MSDN&view=netframework-4.8#System_Windows_Forms_Application_DoEvents

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:10a3:ccf5:8abe:2c56...–
gna
~ Anonymní uživatel
1850 příspěvků
26. 5. 2019   #7
-
0
-

#6 jerry
To byly jen faktické poznámky.

A zase jsi napsal krávovinu. Ty vždycky píšeš jen krávoviny.

Nahlásit jako SPAM
IP: 213.211.51.–
jerry
~ Anonymní uživatel
504 příspěvků
27. 5. 2019   #8
-
0
-

#7 gna
njn je to se mnou špatný, jako programátor sem úplně nahovno :))) tak to je ...  vrátim se zpátky do školy začnu u basicu  :)))

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:7862:181f:5b0:b20c...–
27. 5. 2019   #9
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
Frank
~ Anonymní uživatel
11 příspěvků
27. 5. 2019   #10
-
0
-

#9 hlucheucho 

Ahoj

kvuli tomu jsem se snazil pouzit Marquee ProgressBar, abych nemusel vytvaret ProgressChangedEventHandler.

Kazdopadne diky za odpoved, zkusim si to precist. 
 

Nahlásit jako SPAM
IP: 77.242.95.–
Frank
~ Anonymní uživatel
11 příspěvků
27. 5. 2019   #11
-
0
-

Dekuju vsem za odpovedi, 

prisel jsem na to, ze pravdu mel gna. Proste to skoncilo prilis rychle. Nejdelsi operace je  DataGridView.DataSource = (DataTable)e.Result, ktera uz bezi v RunWorkerCompleted. Myslel jsem, ze dlouhy je vypocet radku tabulky, ne zapsani DataTable do DataGridView. Zbyva vyresit, jak pristoupit k datagridview z DoWork. Nebo tam proste dat presypaci hodiny a nasrat. 

Jeste se teda podivam na int cislo = GenericList[2].ToString() == string.Empty ? 1 : Convert.ToInt32(GenericList[2]). Opravdu se ucim programovat z ucebnice. Do List<object> Arguments predavam jeden objekt a dva stringy z textboxu. Myslel jsem, ze to pak musim zpatky prevest. 

Nahlásit jako SPAM
IP: 77.242.95.–
27. 5. 2019   #12
-
0
-

You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the BackgroundWorker events.

Když se podíváš do dokumentace, události jsou 3:
- DoWork je samotná práce BackGroundWorkeru
- ProgressChanged slouží ke komunikaci s GUI za běhu, ukázky většinou posouvají ProgressBar, ale může se tam provádět i jiná akce
- RunWorkerCompleted je volána po skončení práce BackGroundWorkeru a umožňuje předat GUI výsledek

 hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

ProgressBar — založil Anderos

Multithread a progressbar — založil aerkain

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý