Wyświetlanie komunikatów serwera QT

0

edit//
Zmieniam pytanie, bo chyba nikt nie wie o co chodzi. W skrócie:

Jak zrobić, żeby móc sterować serwerem z poziomu konsoli (w QT!) (wpisując polecenia, np. start, stop itp.) a jednocześnie żeby serwer działał w tle. Normalnie, jest to dość proste, bo wystarczy przerzucić działanie serwera na oddzielny wątek. Niestety w QT tak nie wyjdzie, bo żeby działały sygnały i sloty, aplikacja musi dojść do funkcji exec(), która jednak blokuje wszystkie wątki (bo ma jakąś globalną wewnętrzną pętlę). Obrazując to, gdy zrobię tak:

Wątek 1:

startWatek2();
//pewien okres czasu w ktorym dzialaja juz oba watki
sterowanieKonsolą(); //operacje IO (cin, cout)

Wątek2:
//zawartosc run();
Server server;
server.wlacz();
exec(); //ten exec blokuje oba wątki (tak ze Watek1 nie dojdzie do funkcji sterowanieKonsola()), nie wiem czemu.

A może jest jakiś inny sposób na to co chcę osiągnąć? Jedyną prostszą alternatywą ale czasochłonniejszą jest chyba stworzenie aplikacji klienckiej z uprawnieniami administratora serwera

0
if(command == "exit") return 0;

Wychodzisz z całej funkcji, nigdy z samej pętli.

0

Zmieniłem pytanie (post pierwszy), może faktycznie wyraziłem się nieprecyzyjnie.

2

exec nie blokuje wszystkich wątków, tylko swój.

Przenośne czytanie konsoli faktycznie może wymagać osobnego wątku, ale możesz pobawić się w użycie API systemowego.

0

No właśnie, @kq, nie jestem przekonany :]. Napisałem program, który ma po prostu coś wyświetlić w wątku głównym (a w tym drugim dałem tylko exec() w run() ) ale już gdy ten drugi dojdzie do exec() no i nie wyświetla (bo wcześniej drugi wątek blokuje jakby pierwszy). Dodam że wykorzystałem dla tego testu najprostsze dziedziczenie QThread. No ale nie ważne, chyba zrobię tak że napiszę aplikację kliencką, z możliwością "administrowania" serwerem zdalnie. Będzie wygodniej, choć niekoniecznie prościej i szybciej :)

Jeszcze jedno pytanie z innej beczki. Jak rozwiązać najoptymalniej rozpoznawanie typu wiadomości przesyłanej między klientem a serwerem? Załóżmy że istnieją 2-3 typy wiadomości:

  • wiadomość ping (serwer na żądanie klienta pinguje innego klienta lub wszystkich)
  • wiadomość tekstowa do innego klienta
  • lista wszystkich klientów

Jak widać, są to różne typy wiadomości (z różną zawartością). Najprościej byłoby przesłać gdzieś na początku jakiś QString, który wskazuje na ten typ, np "ping", "message", "client_list" i jakoś to w if'ach obsłużyć (tak żeby wiedzieć jaką klasę deserializować). Czyli coś w stylu np.

ID_do_kogo <<< Typ << Treść właściwa

Coś jak enkapsulacja w ramkach ethernetowych, gdzie pierwsze pole to int z ID klienta, do którego to jest wysłane (ewentualnie jakiś multicast/broadcast), drugi to właśnie ten typ wiadomości (ping, wiad. tekstowa, lista klientów) i treść właściwa. Serwer sobie dekapsuluje (?) tylko ten nagłówek (adresata i typ) i na podstawie tego podejmuje akcje co i komu wysłać.

Czy jest jakaś lepsza, przeznaczona do tego celu metoda?

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.