簡體   English   中英

C++ 輸入和 output 同時到控制台 window

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

我正在編寫一個服務器(主要用於 windows,但如果我可以將它保持在多平台上會很酷),我只使用普通控制台 window 。 但是,我希望服務器能夠執行諸如 say text_to_say_here 或 kick 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,但更重要的是,您必須在兩個讀/寫線程之間共享一個互斥鎖,以避免線程踩到另一個線程並在 output 之上寫入控制台時出現任何問題的另一個線程。 換句話說, std::coutstd::cinfprintf()等不是多線程安全的,因此,在發生讀取或寫入的兩個操作之間會出現不可預知的交錯模式。另一次讀取或寫入已經發生。 您可能很容易在寫入過程中嘗試讀取,此外,當您在控制台上輸入輸入時,另一個寫入線程可能會開始在控制台上寫入,從而使您的視覺混亂'正在嘗試輸入作為輸入。

為了正確管理異步讀寫線程,最好設置兩個類,一個用於讀取,另一個用於寫入。 在每個 class 中,設置一個消息隊列,該隊列將存儲消息(很可能是std::string )供主線程在讀取線程的情況下檢索,並在主線程的情況下將消息推送到寫入線。 您可能還想制作一個可以打印提示的特殊版本的讀取線程,主線程將消息推送到其消息隊列中,主線程將在從stdinstd::cin讀取之前打印提示。 然后,兩個類將共享一個公共互斥鎖或信號量,以防止 I/O 的不可預測的交錯。 通過在任何iostream調用之前鎖定公共互斥體(之后解鎖),將避免任何不可預測的 I/O 交錯。 每個線程還將添加另一個互斥鎖,該互斥鎖對每個線程都是唯一的,可用於維護對類內部消息隊列的訪問的排他性。 最后,您可以將每個 class 中的消息隊列實現為std::queue<std::string>

如果您想讓您的程序盡可能跨平台,我建議您使用 Boost::threads 或使用新的 C++0x std::threads 庫來實現它。

如果您放棄控制台 window 並使用 TCP 連接進行命令和控制,您的服務器將更容易保持多平台,並且更簡單和更靈活。

您可以嘗試將輸入和 output 放在不同的線程上。 我不太確定你為什么要這樣做,但線程應該可以完成這項工作。 :)

http://en.wikibooks.org/wiki/C++_Programming/Threading

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM