ProgressBar w drugim wątku(?)

0

Witam, uczę się wątków i mam kłopot, siedzę and tym sporo więc już mam straszny mętlik w głowie...
W Public Form1 stworzyłem nowy wątek:

Thread t1 = new Thread(One);
            t1.Start();

No i stworzyłem metode:

public void One()
        {
            Label lab = new Label();
            lab.Location = new Point(22, 100);
            lab.Text = "Test";
            tabPage1.Controls.Add(lab);

            ProgressBar pBar1 = new ProgressBar();
            pBar1.Location = new Point(41, 0);
            pBar1.Size = new Size(588, 3);
            tabPage1.Controls.Add(pBar1);

            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
            timer.Enabled = true;
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
            
        }

No i jak mogę teraz dodawać wartość do progressbaru, który stworzyłem właśnie?
Zrobiłęm metodę:

 private void timer_Tick(object sender, EventArgs e)
        {
            
        }

Ale VS nie pokazuje mi możliwości użycia pBar1. Jak prawidłowo powinienem to zrobić?

0

Tworzenie i modyfikacja, ogólnie bawienie sie z GUI w C# nalezy wykonywać tylko z wątku głównego. W timer_Tick nie widzi progresBara, bo go zadeklarowałeś tylko w metodzie One. Zadeklaruj go jako pole klasy. Wątki są po to, żeby przerzucić tam:
a/ skomplikowane długotrwałe obliczenia
b/ operacie które mogą trwac dłużej (np łączenie z serwerem, wysyłanie czegoś itp)
Tworzenie GUI nie jest żadnym z tych wypadków.

Nie używaj System.Windows.Forms.Timer tylko System.Threading.Timer. Co więcej tutaj odpalasz timera w wątku(!) i tracisz nad nim kontrole, nie jesteś w stanie go zatrzymać, cokolwiek zrobić, bo znika Ci referencja do niego, a sam timer dalej działa.

0

Ja rozumiem lecz mam tak, że mam pewną funkcje, któa pobiera różne rzeczy ze źródła strony i niekiedy trwa to ponad 5 sekund. Chciałbym dla "oka" wyświetlić progressbar, który mniej więcej by cośtam poakzywał(nie chodzi mi o jakieś mega dokąłdne dane). Ale próbowałem zrobić tak, że w timerze dodaje 1 do progressBaru a gdy tamta funkcja skończy się wartośc progressBaru ustawiałęm na 100. I to wszystko by mnei zadowoliło lecz niestety progressBar ruszał się dopiero po skończeniu tamtej funkcji więc w niczym mnei to nie zadowoliło. Myślałem, że jak stworze progressBar w drugim wątku będzie on się ruszał w tym samym czasie co wykonywała się będzie moja funkcja.

0

Stwórz sobie progressbar normalnie przez designera tylko go ukryj. Gdy wywołujesz funkcję, która coś tam pobiera, pokazujesz tego progressbara (visible, i tak musisz to zrobić na chwile wpadając z powrotem do wątku głównego, bo tak jak pisałem, nie mozna modyfikować GUI z wątku pobocznego) a potem co operację zwiekszasz go o ileśtam. Np jeśli masz do wyciagnięcia 10 rzeczy ze źródła strony, to ustawiasz na starcie progressbara na max 10 i co każdą wyciagnietą rzecz robisz ++, a na końcu chowasz progressbara. Nie potrzebny jest zaden timer dodatkowy.

0

A nie bezie wtedy takiego efektu "stopowania", że w jednej chwili wartość skoczy o 10 a potem znowu na xxsec się zatrzyma i potem znowu od razu o 10 itp?

0

ale nie jesteś w stanie przewidzieć, ile to będzie trwało, prawda? Wiec jaki sens ma dodawanie +1 w timerze, gdy jak dojdzie do 30/100 to nagle przeskakuje do końca? Albo gorzej, gdy już dawno dojdzie do końca, a operacje dalej bedą trwały...

0

No niby nie lecz mimo wszystko chodzi to dziwnie bo raz się doda ta wartość do progressbaru a raz nie i często jest, że przed operacją dodaje mi 10 do wartości a potem dopiero reszte po operacjach(choć mimo wszystko tam dałem w "Trakcie" operacji dodawanie wartości do progressBaru.

1 użytkowników online, w tym zalogowanych: 0, gości: 1