Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
n5ver
Člen
Avatar
n5ver:14.1.2015 22:42

Ahoj, ačkoliv v programu vůbec nijak nepracuji s vlákny, když chci listBox vyčistit pomocí Items.Clear() a naplnit pomocí Items.AddRange(_db­.VratVsechno) (vrací pouze stringové pole s názvy položek) dostávám tuto výjimku: Operace mezi vlákny není platná: Přístup k ovládacímu prvku listZaznamu proběhl z jiného vlákna než z vlákna, v rámci kterého byl vytvořen.

Naví prosím někdo co s tím?

 
Odpovědět
14.1.2015 22:42
Avatar
n5ver
Člen
Avatar
n5ver:14.1.2015 22:56

Tak jsem přišel na to, že to vyhazuje výjimku v EventHandleru timeru, který se aktivuje, po končení odpočtu.

 
Nahoru Odpovědět
14.1.2015 22:56
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na n5ver
Jan Vargovský:14.1.2015 23:18

Timer běží ve vlastním vlákně, takže musíš použít Invoke metodu.

 
Nahoru Odpovědět
14.1.2015 23:18
Avatar
n5ver
Člen
Avatar
n5ver:14.1.2015 23:23

Aha... Já s tím nemám zkušenosti. Prosím poradil by jsi mi jak to napsat? Potřebuji, aby se provedla metoda reload()

void casovac_Elapsed(object sender, ElapsedEventArgs e)
        {
            bool prazdno = _db.Seznam.Any();
            if(prazdno)
            {
                foreach (Zaznam zaz in _db.Seznam)
                {
                    _datum = DateTime.Now;
                    string datum1 = zaz.Datum.ToString("dd.MM.yyyy");
                    string datum2 = _datum.ToString("dd.MM.yyyy");
                    if (datum1 == datum2 && !zaz.Zobrazeno)
                    {
                        zaz.Zobrazeno = true;
                        MessageBox.Show(zaz.Nazev + " " + datum1, "Upozornění!");
                        reload();
                    }
                }
            }
        }
Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
14.1.2015 23:23
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na n5ver
Jan Vargovský:14.1.2015 23:27

Ukaž mi tu metodu reload.

 
Nahoru Odpovědět
14.1.2015 23:27
Avatar
n5ver
Člen
Avatar
Odpovídá na Jan Vargovský
n5ver:14.1.2015 23:41

Je tam jen

listZaznamu.Items.Clear();
listZaznamu.Items.AddRange();
 
Nahoru Odpovědět
14.1.2015 23:41
Avatar
n5ver
Člen
Avatar
Odpovídá na n5ver
n5ver:14.1.2015 23:48

Na to řešení jsem klikl omylem. Jsem na mobilu...

 
Nahoru Odpovědět
14.1.2015 23:48
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na n5ver
Jan Vargovský:15.1.2015 0:11

to tvoje "jen" je to, co ti způsobuje tu vyjímku, protože saháš na ten listBox z jiného vlákna (z toho timerového).

Místo čistého reload zavolej tohle:

listZaznamu.Invoke((MethodInvoker)reload);

Tím řekneš z tvého timerového vlákna něco ve smyslu: hej, tu máš odkaz na mojí metodu a vykonej si jí u sebe, protože já k němu nemám přístup.

 
Nahoru Odpovědět
15.1.2015 0:11
Avatar
n5ver
Člen
Avatar
n5ver:15.1.2015 6:44

Děkuji za pomoc.

 
Nahoru Odpovědět
15.1.2015 6:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.