C++ 控制台输入 block 所以我不能杀死线程

标签 c++ multithreading windows-8.1 user-input blocking

我的程序有许多不同的线程处理不同的事情,其中​​一个处理用户输入。

其他线程没有太多阻塞调用的方式,那些阻塞的线程是基于网络的,因此当套接字关闭时将被中断或正常返回。

然而,用户线程调用了 std::cin 以获取用户输入。这样做的效果是,当所有其他线程都死了时,用户线程仍在阻塞用户输入,并且只会在下一次输入时死掉。

有什么方法可以让我在阻塞之前检查是否有任何用户输入要抓取?

我知道 cin.peek() 存在,但根据我的经验,如果没有任何内容可读,它就会阻塞。假设我正确使用它

我的代码基本上是一个无限循环,当另一个线程切换条件变量时停止:

void doLoop()
{
    while (running) //running is shared between all threads and all others die quickly when it is false. It's set to true before the threads are started
    {
        string input = "";
        getline(cin, input);

        //Handle Input

    }
}

我在 Windows 上,使用 VS2013,无法使用外部库。我一直在使用 windows.h 和 std。

最佳答案

我相信 C++ 标准没有提供一种不阻塞地检查标准输入的方法。由于您愿意使用特定于平台的功能,“kbhit()”可能适合您的需要,但它在 Windows 中已被弃用。提供了一个替代方案,_kbhit()。当然这不能移植到其他平台。

这是 MSDN 的链接:_kbhit

关于C++ 控制台输入 block 所以我不能杀死线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710672/

相关文章:

c++ - 奇怪的 c++ 输入转义和空格行为

java - 如何使用 Stream Java 8 并行化 Java 程序

c# - 将列表(String)保存到应用程序/隔离存储(Win8.1)

c# - 单击按钮时隐藏弹出按钮 (DelegateCommand)

C++11 initializer_list 构造函数,带有自定义 vector 类的头文件和 cpp 文件

c++ - 无法访问 vector 中的整数

c++ - Clang 无法在 std::function 实例化中扩展参数包

c# - 唤醒线程以退出的最佳方法? C#

c++ - 使用 select() 系统调用语句关闭线程?

javascript - WebView 滚动内容