C++ Eingabe und Ausgabe an der Konsole-Fenster zur gleichen Zeit
Ich Schreibe ein server(vor allem für windows, aber es wäre cool, wenn ich könnte halten Sie es Multiplattform) und ich benutze nur ein normales console-Fenster für Sie. Allerdings möchte ich den server tun zu können, Befehle wie sagen text_to_say_here oder kick playername, etc. Wie kann ich einen asynchronen Eingabe/Ausgabe? Ich habe schon versucht, einige Sachen mit der normalen printf() und gets_s aber das führte zu einigen wirklich.... weird stuff.
Ich meine so etwas wie dieses Eins
Dank.
- Was für "komische Sachen"?
- Shameless plug 🙂
- nur die Simulation einer interrupt-handler. werden Sie gut zu gehen, denke ich.
- "wenn ich könnte halten Sie es Multiplattform"? Was hindert dich daran?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Quick code um die Vorteile von C++11 Funktionen (z.B. cross-Plattform)
Können Sie simulieren asynchrone I/O mit threads, aber noch wichtiger ist, müssen Sie die Freigabe eines mutex zwischen zwei read/write-threads, um jede Gefahr zu vermeiden, mit einem Faden, dem man auf einem anderen thread und schreiben auf die Konsole auf der Oberseite der Ausgabe von einem anderen thread. In anderen Worten
std::cout
,std::cin
,fprintf()
usw. sind nicht multi-thread-sicher, und als Ergebnis erhalten Sie eine unberechenbare interleaving-Muster zwischen den zwei Operationen, bei denen eine lese-oder Schreibzugriff erfolgt, während ein anderer Lesen oder schreiben, war schon passiert. Sie könnte leicht am Ende mit Lesen versuchen, statt in der Mitte zu schreiben, und darüber hinaus, während Sie mit der Eingabe, eine Eingabe auf der Konsole, einem anderen thread schreiben konnte, starten Sie das schreiben auf die Konsole, so dass eine visuelle Durcheinander von dem, was Sie versuchen zu geben, die als input.Um richtig zu verwalten Sie Ihre asynchronen lese-und schreib-threads, wäre es am besten, um das setup zwei Klassen, eine für Lesen und eine für schreiben. In jeder Klasse, setup, message queue, die entweder Nachrichten speichern (wahrscheinlich
std::string
) für den Haupt-thread abrufen, die im Falle des thread Lesen, und für den Haupt-thread, um push-Nachrichten im Fall der write-thread. Möglicherweise möchten Sie auch eine spezielle version von deinem thread Lesen kann, drucken Sie eine Eingabeaufforderung, mit einer Meldung stieß in der Nachrichtenwarteschlange von dem Haupt-thread, die das drucken wird eine Eingabeaufforderung vor dem Lesen vonstdin
oderstd::cin
. Beide Klassen werden dann ein gemeinsames mutex oder semaphore, um zu verhindern, dass unvorhersehbare Verschränkung von I/O. Durch sperren des gemeinsamen mutex vor jederiostream
Anrufe (ein entsperren es danach), jede unvorhersehbare Verschränkung von I/O-vermieden werden. Jeder thread wird auch hinzufügen, ein weiteres mutex, die einzigartig für jeden thread, kann verwendet werden, zur Aufrechterhaltung der Exklusivität, um den Zugang zu der Klasse der internen message-queue. Schließlich implementieren Sie die message queues in jeder Klassestd::queue<std::string>
.Wenn Sie möchten, dass Ihr Programm als cross-Plattform wie möglich, würde ich vorschlagen, die Umsetzung dieser entweder mit Boost::threads, oder mit der neuen C++0x-std::threads Bibliotheken.
Wenn Sie Graben Sie das Konsole-Fenster und die Verwendung von TCP-verbindungen für Befehl und Kontrolle ist, wird Ihr server wird viel einfacher zu halten multi-Plattform und auch einfacher und flexibler.
Können Sie versuchen, indem die input-und output auf separate threads. Ich bin mir nicht ganz sicher, warum Sie wollen, dies zu tun, aber threading sollte den job tun.
🙂
http://en.wikibooks.org/wiki/C++_Programming/Threading