Drugi wątek robi coś na GUI w Formsach

0

Mam taką sytuację że odpalam sobie wątek i chcę w nim zrobić coś na GUI. Robię to w ten sposób:

 
private int go(String va)
        {
            MainForm.Invoke((ThreadStart)delegate
            {
                int val;
                ... tutaj coś robię
            });
            return Convert.ToInt32(val);                            
        }

I teraz pytanie, czy mam 100% pewności że to co jest zawarte w klamrach delegata zostanie wykonane przed returnem?

Może bezpieczniej napisać w ten sposób:

 
private int go(String va)
        {
            MainForm.Invoke((ThreadStart)delegate
            {
                int val;
                ... tutaj coś robię
            
                return Convert.ToInt32(val);                            
            });
            
        }
0

W pierwszym przypadku val jest zmienną lokalną delegata, w związku z czym nie jest widoczna w funkcji go. W drugim przypadku zaś może pojawić się błąd, gdyż o ile mnie pamięć nie myli, delegat typu ThreadStart zwraca void, a nie liczbę całkowitą. Ale wiem o co Ci chodzi :) Chcesz, żeby operacje wykonały się jedna po drugiej, synchronicznie.
I tak w rzeczywistości będzie, w związku z czym użyj przykładu pierwszego. Zadeklaruj tylko zmienną val w ciele funkcji go, a nie tego delegata.

0

Ok, a jaka jest różnica pomiędzy takim wykonaniem:

MainForm.Invoke((ThreadStart)delegate
            {
                operacja 1
                operacja 2
                operacja 3
            }); 

A takim:

MainForm.Invoke((ThreadStart)delegate
            {
                operacja 1
            });
MainForm.Invoke((ThreadStart)delegate
            {
                operacja 2
            });
MainForm.Invoke((ThreadStart)delegate
            {
                operacja 3
            });
0

Odpal to sobie w trybie debugowania, ale myślę, że różnicy zbytniej nie będzie.

0

W debugu jest ok.
Jedna sprawa jest lipna, zrobiłem ten wątek bo czekam aż pewien plik się wyedytuje i nie chcę mrozić GUI. Więc w tym wątku mam kilka pętli while(1) a jednak GUI zostaje zamrożone a jak spróbuję ruszać formatkę to wywala mi windows błąd że program nie odpowiada... DO tego jeżeli w wątku zmieniam cokolwiek w GUI to nie zmienia się od razu tylko dopiero po zakończeniu wszystkich mrożących funkcji while(1)

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