Drugi wątek robi coś na GUI w Formsach

Drugi wątek robi coś na GUI w Formsach
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
 
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:

Kopiuj
 
private int go(String va)
        {
            MainForm.Invoke((ThreadStart)delegate
            {
                int val;
                ... tutaj coś robię
            
                return Convert.ToInt32(val);                            
            });
            
        }
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gród Króla Kraka
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.

  • Rejestracja: dni
  • Ostatnio: dni
0

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

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

A takim:

Kopiuj
MainForm.Invoke((ThreadStart)delegate
            {
                operacja 1
            });
MainForm.Invoke((ThreadStart)delegate
            {
                operacja 2
            });
MainForm.Invoke((ThreadStart)delegate
            {
                operacja 3
            });
A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

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

  • Rejestracja: dni
  • Ostatnio: dni
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)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.