C ++控制台输入块所以我无法杀死线程

时间:2014-12-30 18:33:26

标签: 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。

2 个答案:

答案 0 :(得分:1)

我相信C ++标准没有提供一种无阻塞地检查标准输入的方法。由于您愿意使用特定于平台的功能,'kbhit()'可能适合您的需求,但在Windows中已被弃用。提供了另一种选择,_kbhit()。当然,这不适用于其他平台。

这是指向MSDN的链接:_kbhit

答案 1 :(得分:0)

您可以做的是使用期货来允许用户输入具有时间限制的内容。然后,您可以将此代码插入主循环

#include <iostream>       // std::cout
#include <future>         // std::async, std::future
#include <chrono>         // std::chrono::milliseconds
#include <string>
using namespace std;


bool myAsyncGetline(string & result)
{
    std::cout<<"Enter something within the time limit"<<endl;
    getline(cin,result);
    return true;
}

int main()
{
  // call function asynchronously:
  string res;
  std::future<bool> fut = std::async (myAsyncGetline,res); 


  std::chrono::seconds span (20);
  if (fut.wait_for(span)==std::future_status::timeout)
    std::cout << "Too Late!";
  else
      cout<<"You entered "<<res<<" "<< endl;

  return 0;
}

这在VS2012中可用,因此您应该能够重现它。

输出是“Tool Late!”如果getline在超时(20s)后仍然有效,否则输出结果。

我认为,如果时间限制被击中,那么杀死线程就更容易,因为函数会自动停止。 如果您需要帮助将其集成到我可以提供帮助的现有代码中,请告诉我。