我的程序有许多不同的线程处理不同的东西,其中一个处理用户输入。
其他线程阻塞调用的方式不多,而阻塞调用的线程基于网络,因此当套接字关闭时会被中断或正常返回。
但是,用户线程调用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。
答案 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)后仍然有效,否则输出结果。
我认为,如果时间限制被击中,那么杀死线程就更容易,因为函数会自动停止。 如果您需要帮助将其集成到我可以提供帮助的现有代码中,请告诉我。