同时输入和输出到控制台窗口

C++ Input and output to the console window at the same time

本文关键字:控制台 窗口 输出 输入      更新时间:2023-10-16

我正在编写一个服务器(主要用于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),供主线程在读线程的情况下检索,供主线程在写线程的情况下推送消息。您可能还想创建一个特殊版本的读线程,它可以打印提示,主线程将消息推送到它的消息队列中,主线程将在从stdinstd::cin读取消息之前打印提示。然后,这两个类将共享一个公共互斥锁或信号量,以防止不可预测的I/O交错。通过在任何iostream调用之前锁定公共互斥锁(然后解锁),可以避免任何不可预测的I/O交错。每个线程还将添加另一个互斥锁,该互斥锁是每个线程唯一的,可用于维护对类内部消息队列访问的排他性。最后,您可以将每个类中的消息队列实现为std::queue<std::string>

如果你想让你的程序尽可能跨平台,我建议用Boost::threads来实现它,或者使用新的c++ 0x std::threads库。

如果您放弃控制台窗口并使用TCP连接进行命令和控制,您的服务器将更容易保持多平台,也更简单,更灵活。

您可以尝试将输入和输出放在单独的线程上。我不太确定你为什么要这样做,但线程应该做的工作。:)

http://en.wikibooks.org/wiki/C + + _Programming/线程