Dostęp do kontrolek z innego wątku

0

Mam taki problem:

Mam klase w której mam metodę i tworząc obiekt przekazuje w konstruktorze 2 kontrolki i teraz w obsludze kliknięcia uruchamiam funkcje z mojej klasy w wątku i funkcja ta zmienia wartosci kontrolek i dostaje wyjątek o dostepie z poza wątku i tutaj pytanie jak to naprawić?

kod:

[code]
private void update_Click(object sender, EventArgs e) {
Updater up = new Updater(status,progress);
Thread t = new Thread(up.downloadFunctions);
}
[/code]
[code]
public void downloadFunctions() {
int pobrane = 1;
int wszystkie = getFunctionCount();

        Prog.Maximum = wszystkie;

            foreach (String fid in fIDs) {  
                Stat.Text = "Pobrano " + pobrane + "/" + wszystkie;
                
                Prog.Value =pobrane;

                pobrane++;
                Application.DoEvents();
            }  
        MessageBox.Show("Aktualizowanie zakończone.\nUruchom program ponownie");
    }

[/code]

Stat to statusBar Label a Prog to statusBar progress

0

Jeżeli mowa o Windows Forms (kod nie wkleił się poprawnie i jest nieczytelny) to poczytaj o czymś takim jak BackgroundWorker lub o metodzie Invoke.

0

raczej ktos html w poscie wyłączył xD

w background workerze tego nie zrobie a invoke nie wiem do konca jak zastosować

gdyż sprawa wygląda tak:

tworze wątek i wywołuje funkcje a ta funkcja ma pobrać x plikow z internetu i chce na formie w labelu wypisywać liczbe pobranych plików więc musze robić to w tej funkcji ale sie nie da bo błąd

0
myLabel.Dispatcher.Invoke(()=>myLabel.Content = MyMethod());

Piszę z pamięci dla WPFa z WF będzie podobnie, trzeba wygoglować.

0
 
this.Invoke((MethodInvoker)delegate
            {
              //tutaj robisz co chcesz
            });

PS. this musi dziedziczyć po Control

0

zamienilem wywolania przypisania na tego invokera i dalem tam w srodku przypisanie tekstu i dostaje błąd

Elementów Invoke lub BeginInvoke nie można wywołać w formancie do czasu utworzenia uchwytu okna.

0

Pokaż kod.

0
public void downloadFunctions() {
            int pobrane = 1;
            int wszystkie = getFunctionCount();

            this.Invoke((MethodInvoker)delegate {
                Prog.Maximum = wszystkie;
            });
}
 private void update_Click(object sender, EventArgs e) {
	Thread t = new Thread(up.downloadFunctions);

        t.Start();
}

0

dziala dzięki

0

Na przyszłość, odinstaluj sobie język polski z VS. Taki błąd po angielsku wklejasz w google i często się zdarza że masz gotowe rozwiązanie.

0
xuoo napisał(a):

raczej ktos html w poscie wyłączył xD

Nikt nie wyłączył, bo nigdy nie było włączone. Wklejaj kod jak człowiek, to nie będzie problemu. I na wszelki wypadek używaj zakładki "Podgląd" przed wysłaniem.

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