我知道这个问题已在网上多次询问,但我找不到任何有用的答案。
我想继续运行一个循环,并在用户按一个键(例如enter
或esc
)后将其中断。我不希望它在过程中向用户询问任何输入。
我有一个while
循环。
我是C ++的新手,所以请简单回答。
我的系统是Mac OS X.
答案 0 :(得分:1)
你去吧。我希望这会有所帮助。
#include <iostream>
#include <thread>
#include <atomic>
// A flag to indicate whether a key had been pressed.
atomic_bool keyIsPressed(false);
// The function that has the loop.
void loopFunction()
{
while (!keyIsPressed) {
// Do whatever
}
}
// main
int main(int argc, const char * argv[])
{
// Create a thread for the loop.
thread loopThread = thread(loopFunction);
// Wait for user input (single character). This is OS dependent.
#ifdef _WIN32 || _WIN64
system("pause");
#else
system("read -n1");
#endif
// Set the flag with true to break the loop.
keyIsPressed = true;
// Wait for the thread to finish.
loopThread.join();
// Done.
return 0;
}
更新:由于线程之间共享了标志keyIsPressed
,因此我添加了atomic
。感谢@hyde。
答案 1 :(得分:1)
这确实取决于操作系统,但概率是您使用Windows。
首先,您需要包括:
#include <Windows.h>
它允许您访问GetAsyncKeyState函数,以及Windows&#39;关键宏(list of Windows' key macros)。
您还需要最重要的位来评估按键;只需将其初始化为代码中的const:
const unsigned short MSB = 0x8000;
最后,让我们把所有内容放在一个函数中:
bool listenKeyPress(short p_key)
{
//if p_key is pushed, the MSB will be set at 1
if (GetAsyncKeyState(p_key) & MSB)
{
return true;
}
else return false;
}
//Example of a call to this function to check if up enter is pressed :
listenKeyPress(VK_RETURN)
然后你的while循环可以输入:
while (!listenKeyPress(VK_ENTER))
{
}
或
bool quit = false;
while (!quit)
{
if (listenKeyPress(VK_ENTER) || listenKeyPress(VK_ESCAPE)
quit = true;
}
你去吧!
答案 2 :(得分:0)
很好奇自己在开始时如何做到这一点...结果从来没有真正使用它只是getch()更好但是如果你需要这个并且使用windows包含Windows.h
并且以下代码应该指向你正确的方向(希望如此)
bool f = true;
while (f)
{
if (GetAsyncKeyState(VK_UP)){
//Enter code for when a button is pushed here
f = false;
}
else{
//Code to run until the button is pushed
}
}
如果你想使用另一个按钮VK_UP可以更改为你拥有的任何键或鼠标按钮,只需滚动列表(假设你可能是一名学生使用visual studio)如果你没有列表查找什么键应用对于您要按的按钮。
编辑:此外,如果你想让它永远运行,删除f = false,它会在按下按钮时工作,而不是按下你做任何你想做的事情(不是很好的编码练习,不留下while循环,尽管如此可能最好测试一个键在另一个循环中被按下以退出)