[C#] Wątki

0

Nie wiem dlaczego na forum nie ma kategorii o C#, ale że w tej znajduje się zarówno C++ jak i java to myśle że post będzie tutaj pasował ;)
Piszę obecnie klienta IRC'a, i jak to zwykle w tego typu programach bywa występuje tutaj kilka wątków, u mnie w tej chwili dwa, standardowy obsługujący aplikacjie no i połączenie z serwerem IRC'a. Mój problem polega na tym, że czasami wątek ircowy musi wywołać jakąś metodę gui aplikacji w celu np. stworzenia nowej zakładki na wiadomości z kanału, po otrzymaniu od serwera komendy JOIN, której nasz klient jest głownym bohaterem ;) Czyli mamy JOIN, i wywoływana jest metoda AddTab() która leży w klasie której instancja jest tworzona poza wątkiem irca. To jeszcze nie sprawia problemu, lecz podczas dodawania nowej zakładki do kontrolki TabPages (TabPages.Add(tab);) wyrzucany jest wyjątek:
System.ArgumentException: Controls created on one thread cannot be parented to a control on a different thread.
Czy jest jakiś sposób na ominięcie tego? To moje pierwsza wielowątkowa aplikacja, i niebardzo znam jeszcze metody rozwiązywania takich problemów. Wątek tworzony jest w taki sposób:

ThreadPool.QueueUserWorkItem(new WaitCallback(tabs.Server.Connect));
0

Widac, ze M$ wzorem Suna (Java) stara sie tak robic swoj framework, zeby nie dalo sie robic bledow. I dobrze. W tej sytuacji jednak utrudnia to zycie. Sprobuj w tym watku "sieciowym" wrzucic informacje o koniecznosci dodania taba do jakiejs kolejki. Odczytaj go w watku obslugujacym GUI np. w OnIdle (jesli jest cos takiego - sorry nie znam niestety C#, ale znam Jave, a to jest prawie to samo).

0

Myślałem własnie o takiej kolejce zadań, miałem jednak nadzieje że uda się tego uniknąć, bo byłoby to nieco przekombinowanie rozwiązanie. Dodatkowo coś musiałby zdejmować z niej kolejne zadania, tylko nie mam pomysłu co (wątek z wiadomych względów odpada ;)). Zdarzenia OnIdle ani nic podobnego nie znalazłem, musze poczytać jeszcze o timerach, ciekawe czy metoda przez nie wywoływana jest traktowana jako uruchomiona w osobnym wątku.
Jeśli w C# się nie uda to może spróbuje w Javie. Ważne dla mnie jest to by przyswajać metodologie OOP w praktyce. C# wybrałem bo miał przyjaźniejsze IDE (SharpDevelop), NetBeans zupełnie nie przypadł mi do gustu (jest wolny i ma toporne zarządanie projektami).

Dzieki za odpowiedź,
Pozdrawiam, Cudi

0

C# wybrałem bo miał przyjaźniejsze IDE (SharpDevelop)

Zobacz MonoDevelop. Powstało na bazie SharpDevelop i być może będzie lepsze :)

0

A nie znasz podobnego IDE dla Javy (najlepiej żeby niebyło w niej napisane ;))?

W między czasie poczytałem troche o timerach, i okazało się że będe mógł wykorzystać je do zdejmowania informacji o zadaniach do wykonania z kolejki, nie powoduje to wyrzucenia żadnego wyjątku. Jednak ciągle mam nadzieje że uda mi się uniknąć tworzenia takiego mechanizmu, może ktoś siedzący głębiej w C# będzie znał inne rozwiązanie aby to obejść?

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