Dostęp do kontrolek z innego wątku

Odpowiedz Nowy wątek
2014-09-09 19:20
xuoo
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:


private void update_Click(object sender, EventArgs e) {
Updater up = new Updater(status,progress);
Thread t = new Thread(up.downloadFunctions);
}


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");
    }

Stat to statusBar Label a Prog to statusBar progress

Pozostało 580 znaków

2014-09-09 19:26
tk
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.

Pozostało 580 znaków

2014-09-09 19:32
xuoo
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

Pozostało 580 znaków

2014-09-09 19:38
0
myLabel.Dispatcher.Invoke(()=>myLabel.Content = MyMethod());

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

Pozostało 580 znaków

2014-09-09 19:44
0

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

PS. this musi dziedziczyć po Control

Pozostało 580 znaków

2014-09-09 20:14
xuoo
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.

Pozostało 580 znaków

2014-09-09 20:22
0

Pokaż kod.

Pozostało 580 znaków

2014-09-09 20:39
xuoo
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();
}

Pozostało 580 znaków

2014-09-09 20:52
0

Spróbuj może z tym:
http://stackoverflow.com/ques[...]l-until-the-window-handle-has

Pozostało 580 znaków

2014-09-09 21:05
xuoo
0

dziala dzięki

Pozostało 580 znaków

2014-09-09 21:12
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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