Czy chcesz zareagować na tę wiadomość? Zarejestruj się na forum za pomocą kilku kliknięć lub zaloguj się, aby kontynuować.

Label nie zmienia tekstu

3 posters

Go down

Label nie zmienia tekstu Empty Label nie zmienia tekstu

Pisanie by purple 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.
purple
purple

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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by Fores 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
Fores
Fores

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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by purple 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.
purple
purple

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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by Fores 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
Fores
Fores

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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by purple 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
purple
purple

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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by wojtek656 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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by Fores 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.
Fores
Fores

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

Powrót do góry Go down

Label nie zmienia tekstu Empty Re: Label nie zmienia tekstu

Pisanie by Sponsored content


Sponsored content


Powrót do góry Go down

Powrót do góry


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