cout stört die Eingabe (2 Threads)
-
Wie sehen denn deine Ein- bzw. Ausgabe-Funktionen aus?
Wenn du mit Multi-Threading arbeitest, mußt du natürlich die Zugriffe auf eine gemeinsame Resource (hier: die Konsole) synchronisieren, so daß der Empfangs-Thread warten muß, während der Nutzer etwas eingibt. Alternative Lösungen fallen mir nur mit systemspezifischen Mehoden ein - aber das würde auch darauf hinauslaufen, im Konsolenfenster eine Pseudo-GUI zu gestalten.
-
Über sowas hab ich mir auch schon mehrfach den Kopf zerbrochen, ohne Erfolg. Ich bin zu dem Schluss gekommen, dass sowas nicht möglich ist. Ich würds dann in eine simple GUI packen, in der du unten eine kleine Box (einzeilig) für Eingaben hast und oben eine größere, für die Ausgaben. Ich wollte sowas für eine Client-Server Umgebung haben als provisorischen minimal-Client, der einfache Kommandos asynchron an den Server schickt und Nachrichten vom Server empfängt.
Wenn du in der Hinsicht was nettes hinbekommst sag Bescheid

-
CStoll schrieb:
so daß der Empfangs-Thread warten muß, während der Nutzer etwas eingibt.
Das hieße, dass a) Die Eingabe nicht immer bereit ist und man sie "irgendwie" bereit schalten muss, oder b) die Eingabe immer bereit ist (cin eben) und dadurch die Ausgabe/der Empfang fast immer blockiert ist.
-
Jo, das Problem hatte ich bei meinem aktuellen Projekt auch ( eben ein kleines Chat-Programm ) . Aber wenn du ein Chat Programm coden willst, dann brauchst du so und so zmd ein kleines GUI, von daher ... alles andere wäre glaube ich auch unnötig kompliziert.
Offtopic : Gibt es eig. irgendeine Methode ein Server-Programm irgendwo extern laufen zu lassen ? Ohne Kosten wohl ja nicht ? Das macht selbstgecodede Chat-Programme iwie unlukrativ, würde viel mehr Spass machen wenn man nicht eigends immer iwo den Server starten müsste ... denn dann läuft das ja nur, falls der PC mit dem Server gerade zufällig am Laufen ist. Ausserdem muss der Client dann jedes mal die IP + Port eingeben, wenn man davon ausgeht, dass der Server nicht immer auf dem gleichen PC gestartet wird.
-
pumuckl schrieb:
CStoll schrieb:
so daß der Empfangs-Thread warten muß, während der Nutzer etwas eingibt.
Das hieße, dass a) Die Eingabe nicht immer bereit ist und man sie "irgendwie" bereit schalten muss, oder b) die Eingabe immer bereit ist (cin eben) und dadurch die Ausgabe/der Empfang fast immer blockiert ist.
Ja, das ist mir auch aufgefallen, aber mit Standard-Mitteln fällt mir auch nichts besseres ein.
Außerhalb des Standards könnte man die Eingaben direkt von der Tastatur holen und zwischenspeichern und dann aus der Ausgabe-Funktion heraus die vorhandene Eingabezeile überschreiben und eine Zeile tiefer neu ausgeben.
-
CStoll schrieb:
pumuckl schrieb:
CStoll schrieb:
so daß der Empfangs-Thread warten muß, während der Nutzer etwas eingibt.
Das hieße, dass a) Die Eingabe nicht immer bereit ist und man sie "irgendwie" bereit schalten muss, oder b) die Eingabe immer bereit ist (cin eben) und dadurch die Ausgabe/der Empfang fast immer blockiert ist.
Ja, das ist mir auch aufgefallen, aber mit Standard-Mitteln fällt mir auch nichts besseres ein.
Außerhalb des Standards könnte man die Eingaben direkt von der Tastatur holen und zwischenspeichern und dann aus der Ausgabe-Funktion heraus die vorhandene Eingabezeile überschreiben und eine Zeile tiefer neu ausgeben.
Da mache ich lieber paar CreateWindowEx call's ^^
-
ideehaber schrieb:
ncurses
ist afaik nicht Plattformunabhängig, weils unter Windows nur mit cygwin oder ähnlichem zusammen läuft.
-
CStoll schrieb:
Außerhalb des Standards könnte man die Eingaben direkt von der Tastatur holen und zwischenspeichern und dann aus der Ausgabe-Funktion heraus die vorhandene Eingabezeile überschreiben und eine Zeile tiefer neu ausgeben.
Ja, nur nehm ich dann lieber irgendein GUI-Toolkit und bau mir eben zwei Textfelder für Ein-und Ausgabe drauf

-
pumuckl schrieb:
Ja, nur nehm ich dann lieber irgendein GUI-Toolkit und bau mir eben zwei Textfelder für Ein-und Ausgabe drauf

Ja, eine GUI hatte er selbst schon genannt - zusammen mit der Aussage, daß er eine andere Lösung sucht (Zitat: "also mit nur einer Konsole und ohne GUI"). Von dem Ansatz aus habe ich mal versucht, kreativ zu werden

-
Vielleicht wäre PDCurses was für Dich. Das gibts fast für jede gängige Plattfrom und ist relativ einfach zu benutzen.