BGW i new form

0

Witam, mam problem z C#.
Chce utworzyć nowe okno mdi child z poziomu nowego wątku. Na początku chciałem to wykonać z zwykłego thread, ale okazało się że to nie możliwe (operacja not thread-safe) i zgodnie z radami z google - powinienem zrobić to z poziomu background workera.
Tylko teraz gdy chce utworzyć mdi child z poziomu background workera cała aplikacja się wiesza - pokazuje się nowe okno Form lub mdi child ale aplikacja się wiesza nie wyrzucając żadnych błędów. Myślałem że jakiś zły parametr dałem przy tworzeniu mdi child - ale nie bo nawet zwykłego
Form test = new Form(); test.Text = "abc"; test.Show();
nie moge wykonać w background worker bo też się wiesza.
Nie wiem czy wklejać kod bo zarówno bakcground worker tworze najprostrzą metodą jak i Form chce najprostszy utworzyć. Dlatego jakby mógł ktoś wkleić przykładowy kod tworzenia zwykłęgo Form z background workera byłbym bardzo wdzięczny. Problem opisałem na google.groups .net ale nie otrzymałem odpowiedzi.

0

Nie da się. Wszystkie okna, które są ze sobą związane muszą być w tym samym wątku. Nie może być tak, że okno główne utworzone w głównym wątku aplikacji ma jako child okienko z innego wątku.
Możesz za to wyświetlać dane, które są rezultatem operacji w innych wątkach w okienkach mdi child (przez Invoke/BeginInvoke) tak samo, jak to się robi dla normalnego okna.

0
othello napisał(a)

Nie da się. Wszystkie okna, które są ze sobą związane muszą być w tym samym wątku.

Ale przecież to nie możliwe że wszystkie aplikacje MDI są jedno wątkowe...
Poza tym musi być jakaś metoda tworzenia nowych okien które są skutkiem otrzymanych wyników od threada ?

0

Ale przecież to nie możliwe że wszystkie aplikacje MDI są jedno wątkowe...

Nikt tak nie twierdzi.

Poza tym musi być jakaś metoda tworzenia nowych okien które są skutkiem otrzymanych wyników od threada ?

No i jest taka metoda. Invoke/BeginInvoke i event do okna głównego, które tworzy okna MDI child lub uaktualnia zawartość istniejących.
Nie mieszaj warstwy GUI z warstwą wszystkich operacji, które powinny działać w tle (w domyśle - w innych wątkach). Zasada jest taka - wątki poboczne coś robią i wyniki swoich działań przekazują do wątku gui - czy to będzie mdi child czy jakakolwiek inna kontrolka to nie ma znaczenia.

0
othello napisał(a)

Invoke/BeginInvoke i event do okna głównego, które tworzy okna MDI child

A możesz taki przykład napisać tego, lub podać link gdzie dokładnie taki przykład będzie ? (linki i przykłady samego invoke i samego tworzenia okien nie potrzebuje bo wiem jak to się robi, wolałbym połączone zobaczyć)

0

No ale w czym problem? Jak umiesz wysłać event z innego wątku do wątku głównego to jestes w domu. W obsłudze eventa możesz decydować czy chcesz utworzyć nowe okienko MDI child czy dobrać się do istniejącego i w nim cos zmienic (wykorzystaj EventArgs) albo wysyłac różne eventy - jak ci wygodniej.

Ja bym to w każdym razie tak robił - jeżeli ktoś ma inny pomysł to niech tu się wpisze.

0
othello napisał(a)

Jak umiesz wysłać event z innego wątku do wątku głównego

Event? a możesz podać przykład wysyłania event z innego wątku do wątku głównego ?

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