Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 530

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

1

19.02.2011, 12:39

C++ Konsolen Chat

Servus zusammen,

bin gerade dabei ein Chat für die Konsole zu schreiben. Allerdings stehe ich jetzt vor einem Problem. Mein Client kann Nachrichten an den Server schicken, welcher sie wiederrum an die anderen Clienten weiterleitet ...
Da die anderen Clienten aber in der Abfrage für ihre eigenen Nachrichten stecken (cin >> nachricht) erhalten sie die gesendeten Nachrichten der anderen Clienten erst wenn sie selber was verschicken :(

Kann man das irgendwie in der Konsole lösen oder muss ich eine GUI schreiben ? ^^

lg
SD
...

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

19.02.2011, 12:44

also wenn du eine nachricht schicken willst, während du tippst, dann musst du einen extra thread für das empfangen der nachrichten machen. sonst wartet dein chatclient ja auf eine eingabe und danach geht er erst deine loop durch und holt die nachricht :)

3

19.02.2011, 12:52

Du kannst dir ja mal das hier durchlesen. Du kannst deinen Sockets nämlich auch "sagen" ob sie im Blocking- oder im Non-Blocking-Modus arbeiten sollen. ;)

Gruß
SaRu_

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

19.02.2011, 13:55

ich hatte meinen chat auch erst in der konsole geschrieben. mir ist es nicht gelungen gleichzeitig eine eingabe zu tätigen und eine nachricht auszugeben ohne, dass die texte durcheinander gekommen sind.
wenn ich z.b. "hund" schreiben wollte und währenddessen eine nachricht "blub" kam stand bei mir "hublubnd". nicht besonders schön^^ es geht sicher auch ordentlich aber ich wollte sowieso lernen eine grafische benutzeroberfläche mit C++ zu erstellen und hab gleich wxwidgets benutzt anstatt mich ewig mit der konsole zu beschäftigen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

19.02.2011, 13:57

@ saru
aber auch im non-blocking mode, werden die nachrichten ohne zusätzlichen thread, der die nachrichten empfängt, erst empfangen, nachdem der benutzer was in der Konsole eingegeben hat. Denn die nachrichten werden ja erst nach dem cin>> empfangen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

19.02.2011, 16:05

Nur um es zu vervollständigen; Es gibt 3 Grund- und viele Mischvarianten:
1.threading
2.select
3.nonblocking
Zum Problem:
Theoretisch kann man Texteingaben auch nonblocking abfragen, aber wie schon richtig bemerkt wurde ist cin dafür nicht geeignet. Um zu verhindern, dass die Nachrichten alle quersch gehen, empfiehlt sich ein Aufteilen der Konsole (aber im Endeffekt geht der Konsolencharakter verloren):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
inline void PortableOutput(const std::wstringstream &str, int y=0, int x=0)
{
    COORD pos = { x, y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
    std::wcout << str.str().c_str();
}
//bzw. für linux
inline void PortableOutput(const std::wstringstream &str, int y=0, int x=0)
{
    mvaddwstr(y, x, str.str().c_str());
    refresh();
}
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige