【发布时间】:2017-05-03 19:25:44
【问题描述】:
是否可以像这样创建一个while循环:
bool stop_input = false;
while (!stop_input) {
// Keep getting inputed string
// Maybe like std::getline(std::cin, str_input);
}
这将继续循环并获取用户在控制台中输入的内容而不会停止(冻结),例如在执行std::cin 或std::getline() 时。
我对此感兴趣,希望有一个单独的线程可以在等待用户输入内容并按 Enter 时执行其他操作,然后 stop_input 将变为真,并且用户输入将被禁用。
这可能吗?怎么样?
编辑:
例如,如果我这样做了:
void test()
{
std::string str;
while (!stop_input) {
std::getline(std::cin, str);
}
}
如果我创建了一个像上面这样的函数,编译它并启动一个调试器,调试器(程序)将在 std::getline() 被第二次调用时停止。我不希望这种情况发生,我希望这个循环持续运行,直到通过设置 stop_input = true; 停止。
EDIT2:
主线程:
void someFunction()
{
string read_input;
thread get_input = thread(readInput, &read_input);
while(1) {
if (buttonPressed(ENTER) {
stop_input = true;
get_input.join();
// Do something with 'read_input' string.
} else if (buttonPressed(ESC) {
stop_input = true;
get_input.join()
// Discard 'read_input' string and return from this function.
break;
}
}
}
阅读线程:
void readInput(string* input)
{
while (!stop_input) {
//Get input
}
}
附:当然主线程也会在后面做一些工作,与输入读取无关。
【问题讨论】:
-
您的解决方案涉及操作系统的特定功能,例如在 key 被按下 时收到通知或轮询以查看 key 状态 已更改。由于您没有在帖子中指明您的操作系统,因此无法进一步帮助您。在互联网上搜索“stackoverflow c++ keypress”。
-
@ThomasMatthews 我可以得到一个按键。我的问题是是否可以像描述的那样实现输入读取?
-
您希望您的程序在按下或释放按键时中断吗?你想让你的程序poll键盘的状态吗?处理输入的不同方法。我建议将输入处理放到一个单独的线程中。
-
@ThomasMatthews 我感觉你不理解我的问题(它可能措辞不当)。忘记按键,就完成了。现在,当调用 std::cin 或 std::getling() 时,它们会冻结程序,阻止其他代码继续执行。我想要做的是,有一个单独的线程,其中 std::cin 或 std::getline() 之类的东西会运行但不会停止(冻结),它会不断运行并获取用户输入,直到一些 bool 被设置。我希望我现在说清楚了(我不是以英语为母语的人)。
-
我不确定术语“GUI 线程”是否适用于控制台,但我认为用户输入不应来自主线程以外的任何地方。有一个主线程和一个工作线程,你需要主线程执行你的任务的原因是什么?
标签: c++ multithreading