WindowsForms i wielowątkowość

0

Piszę wielowątkowy program w WindowsForms. Formsów są dwa, ale może zaraz zostanie tylko jeden.

No coś tam niby stworzyłam, teraz się okazuje, że zawiesza mi formę, bo źle rozwiązałam update'owanie GUI. Próbuję właśnie rozplątać ten węzeł. Nie rozmawiajmy o tym, jak to teraz jest zrobione, bo się wstydzę ;)

Znajomy programista C++ poradził mi, bym wydzieliła całkiem logikę aplikacji i dopiero wtedy dorobiła GUI. Zasugerował, że najlepiej byłoby w głównej klasie programu zarządzać jedynie wątkami (wątkiem GUI i wątkami workerami).
Zaczęłam więc szukać informacji na temat wywoływania formatki w oddzielnym wątku. W trakcie tych poszukiwań natrafiłam na rozwiązanie, ale również na wypowiedzi takie jak ta: http://stackoverflow.com/a/167429 lub ta: http://stackoverflow.com/a/3482935
Generalnie radzą zostawić tę biedną formatkę w głównym wątku. Główna formatka jako centrum programu. W tej sytuacji sensownie będzie rdzeń programu napisać w kodzie głównej formatki, normalnie po prostu w evencie Click buttona start.

Sensownie? Nie wiem. Brzydko jakoś mi się to wydaje. Jakoś nie podoba mi się umieszczanie zarządzania wątkami w kodzie formatki. Ale przekazywanie tego do głównej klasy programu byłoby po prostu zbędne. Jak bym o tym nie myślała, wszystkie wersje wydają mi się jakieś koślawe, a tymczasem czas goni i chciałabym już po prostu zrobić to jakkolwiek, byle poprawnie.

Co do projektu, to generalnie wygląda on mniej więcej tak, że mamy główny wątek, który powołuje do życia n wątków i te wątki w reakcji na tyknięcie zegara generują dane, które następnie przekazują między sobą. Jedną formę chciałam wykorzystać do wprowadzenia parametrów programu, a drugą do prezentacji tej całej komunikacji. W sumie nie będę płakać, jeśli trzeba by umieścić wszystko na jednej formie. Tak będzie chyba prościej.

Co sądzicie?
Czy powinnam umieścić główny kod programu w głównej formatce, a jej responsywność zapewnić poprzez asynchroniczne wywoływanie metod, jakieś background workery może i takie tam?
Czy też powinnam wykorzystać podpowiedzi ze stack overflow do upchania formatki na siłę w nowy wątek i główną pętlę programu trzymać w Program.cs, gdzie odbywałoby się zarządzanie komunikacją pomiędzy wątkami workerami a wątkiem GUI?

0
aurel napisał(a):

...No coś tam niby stworzyłam, teraz się okazuje, że zawiesza mi formę...

A co debugger mówi?
Strzelam, że chodzi Ci o to: http://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in-c

1

Może MVP wspierający wielowątkowość? Coś jak tutaj: http://www.codeproject.com/Articles/22761/Model-View-Presenter-Using-Dependency-Injection-an

0

To wygląda pięknie :) Chyba będę brnąć w tą stronę, bo jak to widzę, to mi się cała aplikacja rozplątuje, nie tylko problem z aktualizacją GUI. Jak to teraz widzę, to przecież OCZYWIŚCIE, że trzeba oddzielić widok od kontrolera :)

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