Słownik Directionary i otwieranie nowych okienek dynamicznie komunikator

0

Witam,
Piszę komunikator oparty na socketach i połączeniu TCP
Komunikator oparty jest na wielowątkowości i każda rozmowa osoby A z B odbywa się w nowym wątku i z założenia oknie....
Obecnie mam napisane wyświetlanie tekstu w oddzielnym oknie. Można by rzec, że nawet działa, jednak jest pewien problem z okienkami od rozmów. Jest to całkiem nowa forma, która (w rozmowie) rozróżniana jest za pomocą słownika.
Poniższy kod odpowiada za sprawdzenie czy okno jest otwarte, jeśli nie to je otwiera.
Obecnie wyświetla wiadomości, ale tylko w przypadku jak już otwarte okno jest (pierwszej wiadomości która otwiera okno nie wyświetla) I mam pytanie czy jeśli na koniec elsa dopiszę rozmowy[nadawca].wyswietlanie_tekstu(tekst22); to będzie to poprawne, czy jest jakiś lepszy sposób, ładniejszy i bardziej poprawny wykonania?

 if (rozmowy.ContainsKey(nadawca))
                {
                    
                    rozmowy[nadawca].wyswietlanie_tekstu(tekst22);
                }
                else
                {
                    Form2 TheForm;
                    TheForm = new Form2();
                    TheForm.Text=("Rozmowa z "+nadawca);
                    rozmowy.Add(nadawca, TheForm);
                    TheForm.Show();
                } 

Ogólnie wiadomości przychodzą, tworzone są w razie potrzeby nowe okna, tylko że one zachowują się tak jakby "wisiały", tzn jeśli mam na nim jakiegoś buttona, to go nie użyję bo okienko zachowuję się jakby wisiało, ale tekst w richtexboxie wyświetla.
Nie mam zielonego pojęcia co zrobić, żeby "ożywić" okienka rozmów, bo docelowo w nich będzie prowadzona cała rozmowa, a teraz nie jest sposób w richtexboxie coś napisać i przesłać dalej. Proszę o pomoc, co może być przyczyną tego i jak to rozwiązać.
Wielki dzięki.

0

czy ten kod jest wywoływany z wątku? Jeśli tak to poczytaj o invoke. Co do pytania to możesz tam to dopisać albo od razu odwołać się do formy - TheForm.wyswietlenie_tekstu()

0

Wygląda to tak, że po wybraniu "połącz" uruchamiany jest nowy backgroundworker który łączy się z serwerem i po połączeniu się tworzy nowy wątek Thread który jest odpowiedzialny za odbieranie wiadomości(m.in tworzenie, wyświetlanie nowych okien rozmowy), czyli każde nowe okienko z rozmową jest w nowym wątku.

0

A dlaczego każde okienko masz w innym wątku? Nie lepiej żeby całe UI było w jednym i tym samym wątku, a obsługa wszystkich funkcjonalności komunikatora w osobnych wątkach?

0

Każde okienko mam w nowym wątku, bo każda rozmowa jest w nowym wątku, dzięki czemu można rozmawiać jednocześnie z kilkoma osobami naraz, dlatego jak rozpoczynam rozmowę to tworzony jest nowy wątek...
Hmmm mówisz o tym, żeby wszystkie rozmowy były w jednym wątku, i później je jakoś rozdzielać do właściwych okien rozmowy...?
Zrobiłem tak, jak mam, bo jak zaczynałem to tworzyć nie mając zbyt wielkiego pojęcia, a mówiąc szczerze żadnego pojęcia o pisaniu aplikacji sieciowych i wzorowałem się na różnych tutorialach i gotowcach w których to właśnie ta metoda była wykorzystywana...
A jeśli już o tym mowa, to które rozwiązanie jest lepsze??

0

nie bardzo łapiesz ideę wielowątkowości - CAŁE GUI ma swój wątek i w tym wątku ma działać a każdy klient ma swój wątek, który odpowiada JEDYNIE za komunikację klient-serwer natomiast wyświetlenie wiadomości w okienku ma się odbywać w wątku głównym. Do tego min. służy Invoke oraz InvokeRequired

0

No, trochę się już chyba w tych wątkach pogubiłem... no i dopiero się uczę:)
Czyli: tworzę wątęk A który nawiązuje połączenia z serwerem, i tworzy nowe wątki dla każdej rozmowy(w tym wątku tylko odbieram dane) a w wątku A sprawdzam czy dane okno rozmowy już istnieje, jeśli nie to je tworzę, jeśli tak to wyświetlam tekst w tym oknie?? Jeśli tak, to w jaki sposób przekazać tekst odebrany do wyświetlenia.
Hmm chyba trochę mieszam, coś mi się wydaje, dlatego proszę o możliwie jak najaśniejsze wytłumaczenie problemu, za co wielkie dzięki :)
Obecnie mam właśnie, że w wątku który odbiera wiadomości tworzone jest nowe okienko i w tej nowej formie znajduje się metoda wyświetlająca tekst. Ale to jest złe rozwiązanie :)
Dodane:
Powyższe rozważania są błędne. Zgadzam się z wami i macie rację, a ja przepraszam, bo was wprowadziłem w błąd. Przeanalizowałem dokładnie kod klienta, i mam wątek backgrounfworker który nawiązuje połączenie i tworzy nowy wątek odpowiedzialny za komunikację( uruchamia metodę odbierania). W metodzie odbieranie jest odbierany tekst i póki co tam też właśnie były tworzone nowe obiekty form do każdej rozmowy. Teraz moje pytanie, bo z tego co się zdążyłem zorientować muszę użyć delegaty i napisać funkce która w bezpieczny sposób będzie wywoływała nowe okna i umieszczała tam wiadomości, dla tego mam pytanie, gdzie to powinno się znaleźć? W wątku(metodzie odbierania wiadomośći) ??

0

Ok, sprawę to już rozwiązałem, działa wszystko ok.
Chcę dodać do tego taką funkcję, że po zamknięciu okna i po ponownym otworzeniu mamy rozmowę, oczywiście przy danym połączeniu, jeśli nastąpi połączenie od nowa z serwerem (uruchomienie programu od nowa) to nic nie będzie.
Mam pomysł żeby to zrobić tak żeby zapisywać całego richtexboxa.text podczas wysyłania wiadomości i z niego byłoby odczytywane, jeśli by nadawca zamknął okno i rozpoczął dalsze pisanie, i oddzielnie dla odbiorcy, hmm choćby to wcale do końca dobrze nie działałoby, bo jeśli A wysłało wiadomość B i B odczytało i zamknęło okno i po chwili chciałoby wysłać do A, to nie miałoby tej wiadomości...
Najlepiej by było jakoś identyfikować daną rozmowę osoby A z B i B z a jako np abba i zapisywać to hmm właśnie w czym najlepiej to byłoby zapisywać, żeby wywoływać to po parametrze rozmówców??

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