Label nie zmienia tekstu

Zobacz poprzedni temat Zobacz następny temat Go down

Label nie zmienia tekstu

Pisanie by purple on Wto Cze 03, 2014 2:54 pm

Dobry wszystkim!

Piszę tutaj bo mam taki mały, ale dosyć dla mnie dziwny problemik.
Piszę sobie programik do własnego użytku, taki bardzo, bardzo prosty. Wykonuje on w sumie jedno działanie w pętli (for). Ustawiłem sobie kilka labeli, aby informowały mnie o postępach (licznik i aktualnie wykonywana operacja). Wszystko dzieje się po kliknięciu guziorka. Niestety jak zawsze coś musi nie działać. Problem jest taki, że przy przebiegu pętli te labelki nie zmieniają swojej wartości. Jeden zmienia ją raz dopiero po zakończeniu działania programu, a drugi w tym momencie znika.
Debugger pokazuje, że zmienne, jakich wartości mają przyjmować labelki są poprawne.
Pytanie brzmi, dlaczego tak się dzieje i jak temu zaradzić?
Jeśli trzeba to dodam tutaj kod.

PS: jest tam także progressBar, który działa mniej więcej poprawnie. Przy przebiegu pętli staje się szerszy, ale wartości zmieniają się poprawnie. Po pętli jego szerokość jest normalna.
avatar
purple

Liczba postów : 9
Join date : 01/12/2013

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by Fores on Wto Cze 03, 2014 9:53 pm

Najlepiej zamiesc tutaj kod, ktory obsluguje ta funkcjonalnosc. Mogles popelnic wiele bledow, wiec szkoda czasu na zgadywanie Smile
avatar
Fores

Liczba postów : 73
Join date : 30/05/2013
Age : 27
Skąd : Katowice

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by purple on Sro Cze 04, 2014 1:00 am

Kod:
private void button2_Click(object sender, EventArgs e)
        {
            progressBar1.Value=0; // progress na 0
            label3.Text = "Status: scanning";
            WebClient wchtml = new WebClient();

                string htmlString = wchtml.DownloadString(textBox1.Text);
                Regex pattern = new Regex(@"//i.4cdn.org/[a-z]{1,4}/[0-9]{13}\.[a-z]{3,4}");
                MatchCollection links = pattern.Matches(htmlString);

                progressBar1.Maximum = links.Count;
                label1.Text = "Number of pictures: " + progressBar1.Maximum / 2;
                label3.Text = "Status: downloading";
                for (int i = 0; i < links.Count; i += 2)
                {
                    string url = "https:" + links[i].Value;
                    Regex name = new Regex(@"[0-9]{13}\.[a-z]{3,4}");
                    Match m = name.Match(links[i].Value);
                    try
                    {
                        label3.Text = "Status: downloading("+url+")";
                        wchtml.DownloadFile(url, folderBrowserDialog1.SelectedPath + "\\" + m.Value);
                        progressBar1.Value += 2;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                        label3.Text = "Status: aborted";
                        break;
                    }
                }
                label3.Text = "Status: completed";
            }
        }

Działa w tym wszystko z wyjątkiem zmiany tych labeli. Nie do końca rozumiem dlaczego tak się dzieje.
PS: tak, wiem. Nie wygląda to zbyt ładnie.
avatar
purple

Liczba postów : 9
Join date : 01/12/2013

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by Fores on Sro Cze 04, 2014 7:18 pm

Prawdopodobnie powodem jest to, ze wykonujesz dosc dlugotrwala operacje na glownym watku aplikacji przez co formularz nie jest w stanie sie przerysowac.

Przychodza mi do glowy 2 rozwiazania. Zaczne od tego gorszego, ale i tez duzo latwiejszego:

Mozesz wywolac metode: Application.DoEvents(); po kazdorazowej zmianie labela. Jak sama nazwa wskazuje metoda ta wywola odpowiednie zdarzenia, ktore rowniez przerysuja wartosc labela. Przed uzyciem tej metody poczytaj sobie o niej co nieco w googlach. Z reguly jej uzycie nie jest zalecane, ale jak juz uzyjesz to raczej nic zlego sie nie stanie.

Drugi sposob, ktory ja preferuje - background worker. Za pomoca takiej kontrolki mozesz pewne dlugotrwale operacje (jak na przyklad obliczenia) wywolac w osobnym watku, ktory w trakcie wykonywania nie zawiesi UI. Predzej czy pozniej bedziesz musial sie nauczyc, jak korzystac z wielu watkow, dlatego tez proponuje wybrac ten sposob.

Rozwiazania gotowego Ci nie zamieszcze, gdyz wtedy nic sie nie nauczysz (wiem po sobie), przegladnij sobie te linki:
http://stackoverflow.com/questions/4919058/form-not-responding-when-any-other-operation-performed-in-c-sharp
http://stackoverflow.com/questions/5181777/use-of-application-doevents
http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

Jak bedziesz mial pytania, pytaj Smile
avatar
Fores

Liczba postów : 73
Join date : 30/05/2013
Age : 27
Skąd : Katowice

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by purple on Czw Cze 05, 2014 6:10 pm

W sumie to odnośnie tego tematu nie mam już pytań. Czytałem trochę na temat tego backgroundWorkera i bardzo przyjemnie się z nim pracuje o dziwno. Na początku dziwnie, ale jak doprowadziłem to jakoś do porządku to nawet ładnie działa i nie jest zbyt skomplikowane.

Dzięki wielkie za naprowadzenie na temat Wink
avatar
purple

Liczba postów : 9
Join date : 01/12/2013

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by wojtek656 on Nie Sie 31, 2014 6:27 pm

Pewnie juz dawno to rozwiazales, ale czy Background worker dla odswiezania labelek to nie jest przerost formy nad trescia? moze by kod labelek label1.Text wrzucic po prostu do timera z odswiezaniem na 100ms Smile

wojtek656

Liczba postów : 4
Join date : 26/06/2014

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by Fores on Sro Wrz 03, 2014 8:32 pm

Nie jestem pewien, ale w takim przypadku nawet timer moze zostac zablokowany i nie odswiezac poprawnie interfejsu.
Jesli chcemy isc na latwizne to rownie dobrze mozemy przy kazdej iteracji petli wywolywac metode Update() na labelu i tez bedziemy go miec przerysowywanego, ale to nie jest rozwiazanie problemu.
avatar
Fores

Liczba postów : 73
Join date : 30/05/2013
Age : 27
Skąd : Katowice

Zobacz profil autora

Powrót do góry Go down

Re: Label nie zmienia tekstu

Pisanie by Sponsored content


Sponsored content


Powrót do góry Go down

Zobacz poprzedni temat Zobacz następny temat Powrót do góry

- Similar topics

 
Permissions in this forum:
Nie możesz odpowiadać w tematach