如何在按下键之前继续运行循环(C ++)

时间:2015-03-06 19:34:44

标签: c++ macos console-application keyboard-input

我知道这个问题已在网上多次询问,但我找不到任何有用的答案。

我想继续运行一个循环,并在用户按一个键(例如enteresc)后将其中断。我不希望它在过程中向用户询问任何输入

我有一个while循环。

我是C ++的新手,所以请简单回答。

我的系统是Mac OS X.

3 个答案:

答案 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循环,尽管如此可能最好测试一个键在另一个循环中被按下以退出)