同时输入和输出到控制台窗口
C++ Input and output to the console window at the same time
我正在编写一个服务器(主要用于windows,但如果我能让它保持多平台,那将是很酷的),我只是使用一个正常的控制台窗口。然而,我希望服务器能够做的命令,如说text_to_say_here或踢playername等。我怎么能有一个异步输入/输出?我已经尝试了一些东西与正常的printf()和gets_s,但这导致一些真正....奇怪的东西。
我的意思是像这样1
谢谢。
利用c++ 11特性(即跨平台)的快速代码
#include <atomic>
#include <thread>
#include <iostream>
void ReadCin(std::atomic<bool>& run)
{
std::string buffer;
while (run.load())
{
std::cin >> buffer;
if (buffer == "Quit")
{
run.store(false);
}
}
}
int main()
{
std::atomic<bool> run(true);
std::thread cinThread(ReadCin, std::ref(run));
while (run.load())
{
// main loop
}
run.store(false);
cinThread.join();
return 0;
}
您可以使用线程模拟异步I/O,但更重要的是,您必须在两个读/写线程之间共享互斥锁,以避免一个线程踩到另一个线程,并在另一个线程的输出上写入控制台的任何问题。换句话说,std::cout
, std::cin
, fprintf()
等不是多线程安全的,因此,您将在两个操作之间获得不可预测的交错模式,其中读取或写入发生时,另一个读取或写入已经发生。您可能很容易在写入过程中尝试读取,而且,当您在控制台上输入输入时,另一个写入线程可能开始在控制台上写入,使您试图输入的内容在视觉上变得混乱。
为了正确管理异步读写线程,最好设置两个类,一个用于读取,另一个用于写入。在每个类中,设置一个消息队列,该队列存储消息(很可能是std::string
),供主线程在读线程的情况下检索,供主线程在写线程的情况下推送消息。您可能还想创建一个特殊版本的读线程,它可以打印提示,主线程将消息推送到它的消息队列中,主线程将在从stdin
或std::cin
读取消息之前打印提示。然后,这两个类将共享一个公共互斥锁或信号量,以防止不可预测的I/O交错。通过在任何iostream
调用之前锁定公共互斥锁(然后解锁),可以避免任何不可预测的I/O交错。每个线程还将添加另一个互斥锁,该互斥锁是每个线程唯一的,可用于维护对类内部消息队列访问的排他性。最后,您可以将每个类中的消息队列实现为std::queue<std::string>
。
如果你想让你的程序尽可能跨平台,我建议用Boost::threads来实现它,或者使用新的c++ 0x std::threads库。
如果您放弃控制台窗口并使用TCP连接进行命令和控制,您的服务器将更容易保持多平台,也更简单,更灵活。
您可以尝试将输入和输出放在单独的线程上。我不太确定你为什么要这样做,但线程应该做的工作。:)
http://en.wikibooks.org/wiki/C + + _Programming/线程
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- 如何获取控制台窗口的宽度?
- 在C++中隐藏键盘记录器的控制台窗口
- C++ 如何在 OpenGL 程序中远程调用控制台窗口
- 为什么调试时没有显示控制台窗口
- 有没有办法像动画一样移动控制台窗口?
- 如何在C++中居中输出控制台窗口
- 控制台窗口未在开发C++中打开?即使也有 getch() ?
- QTextEdit 提升为构建控制台窗口
- 如何拒绝一个叫做的过程以写入继承的控制台窗口
- Visual C 关闭文本文件和打开新的控制台窗口
- 有没有办法为使用 Boost 生成的进程创建新的控制台窗口
- C++:显示控制台窗口的输出
- C++:如何在控制台窗口中显示结果
- (C++)控制台窗口保持立即关闭,即使我在Visual Studio中是CTRL + F5
- 如何在调用系统()时隐藏控制台窗口
- 在控制台窗口关闭(在Windows上)上优雅地关闭命令行应用程序
- C++控制台窗口放在前面
- C++/CLI 项目如何在控制台窗口中显示消息