IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: C# WinForm Binding, problém s vlákny

Aktivity
Avatar
švrčajs
Člen
Avatar
švrčajs:11.2.2017 23:36

Zdravím, mám problém s bindingem a metodou, kterou spouštím ve vláknu, když ji spustím pomocí vlákna, tak se mi neaktualizují data ve formu, když jsi spustím ovšem pomocí timeru, tak je vše ok... Proměnné, které binduju, mám upravené, že vyvolají událost, při změně..
binding ve formu

Binding speedB = new Binding("Text", wd, "speed", true, DataSourceUpdateMode.OnPropertyChanged);
            Binding directionB = new Binding("Text", wd, "direction", true, DataSourceUpdateMode.OnPropertyChanged);
            Binding gearB = new Binding("Text", wd, "gear", true, DataSourceUpdateMode.OnPropertyChanged);
            Binding wifiSignalB = new Binding("Text", wd, "wifiSignal", true, DataSourceUpdateMode.OnPropertyChanged);
            Binding camOn = new Binding("Text", wd, "camOn", true, DataSourceUpdateMode.OnPropertyChanged);
            label1.DataBindings.Add(speedB);
            label2.DataBindings.Add(directionB);

volání metody pomocí vlákna

public void Start()
        {
            Thread joystick = new Thread(JoystickStart);
            joystick.Start();
            joystick.IsBackground = true;
        }

private void JoystickStart()
        {
            while (true)
            {
                if (JoystickCondition() == false) break;
                Thread.Sleep(35);
            }
            return;
        }

Metoda JoystickCondition, kontroluje stav joysticku a upravuje proměnné, případně posílá data na server...

Neporadil by někdo prosím, kde dělám chybu ?

Editováno 11.2.2017 23:37
 
Odpovědět
11.2.2017 23:36
Avatar
Odpovídá na švrčajs
Michal Štěpánek:12.2.2017 11:01

Když používáš vlákna, musíš se pak starat o synchronizaci... Zkus se mrknout na komponentu BackgroundWorker, na toto bych řekl, že je nejjednodušší, protože se o synchronizaci stará sama...
Z <a href="https:/­/channel9.msdn­.com/Shows/CZSK-videa/video125-PouzitiBackgrou­ndWorkerveWin­Formsaplikacich">to­hoto videa</a> jsem to pochopil i já a to je co říct...

Nahoru Odpovědět
12.2.2017 11:01
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na švrčajs
Petr Čech:12.2.2017 12:52

Vlákna nepoužívej, pokud k tomu nemáš vyloženě důvod. Místo toho se podívej na Tasks a Parallel knihovnu. Tasks se potom dobře používají v GUI díky async-await konstrukci.

Nahoru Odpovědět
12.2.2017 12:52
the cake is a lie
Avatar
švrčajs
Člen
Avatar
Odpovídá na Petr Čech
švrčajs:12.2.2017 19:44

Zkoušel jsem to pomocí Tasku, ale příklady s využitím GUI jsou jen takové, že se přistupuje přímo k prvků a né pomocí nabindování dat... Mohl bych poprosit o ukázku, jak to pořešit ?

 
Nahoru Odpovědět
12.2.2017 19:44
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na švrčajs
Petr Čech:12.2.2017 20:33

Aha. No a proč nemůžeš místo bindingů ta data rovnou měnit v GUI, potom případně bindovat na ně?
Případně udělat další vlastnosti, které budeš měnit z await-async a na ně bindovat, ale to už docela smrdí.

Editováno 12.2.2017 20:34
Nahoru Odpovědět
12.2.2017 20:33
the cake is a lie
Avatar
Odpovídá na švrčajs
don.jarducius:12.2.2017 20:46

Zkus se podívat na tohle

https://msdn.microsoft.com/…vs.110).aspx

Pomůže ti to v pochopení přístupu ke GUI z ostatních vláken.

Nahoru Odpovědět
12.2.2017 20:46
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
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 6 zpráv z 6.