如果用户没有输入任何内容,如何让程序做某事

How to make a program do something if the user doesn't input anything

提问人:Sebitas1212 提问时间:3/20/2023 最后编辑:Jason AllerSebitas1212 更新时间:3/20/2023 访问量:122

问:

我有一个更大的项目,但我需要这个小东西的答案来添加到项目中。

这是我的示例代码:

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
    int m=3;
    while (true){
        if (m==1){
            cout<<"m is 1"<<endl;
            system("cls");
        }
        if (m==2){
            cout<<"m is 2"<<endl;
            system("cls");
        }
        if (m==3){
            cout<<"m is 3"<<endl;
            system("cls");
        }
        m=getch();
    }
    return 0;
}

这段代码的思想是,存在无限循环,它无限期地打印 m 的当前值。只有当用户输入一个值时,打印的消息才会发生变化。但是程序不会等待输入,基本上它不需要输入作为指令来继续做它正在做的事情,如果实际上收到了输入,消息就会改变。

实际上,这不会发生,因为 getch() 使程序停止,直到收到输入。getch() 在某种程度上是我想要的,因为与 cin 不同,它不会等待用户按回车键,但它确实会等待一些东西。

所以我的问题是:我如何让一个程序一遍又一遍地做同样的事情而不停止,当收到输入时(不必停止并请求输入),输出会发生变化?

所以我的问题是:我如何让一个程序一遍又一遍地做同样的事情而不停止,当收到输入时(不必停止并请求输入),输出会发生变化?

我找到了getch()并认为它很有用,因为它不会等待用户按回车键,但它需要输入才能继续程序。

如果重要的话,我在 QT 上。

C++ Windows 循环 输入

评论

0赞 PaulMcKenzie 3/20/2023
看起来您需要了解多线程编程。注意 -- 机器翻译编程并非易事。
1赞 Botje 3/20/2023
Qt 没有针对 TUI 的规定,但像 ncurses 和 Tickit 这样的库有。

答:

0赞 The Wrecker 3/20/2023 #1

首先,我想指出你的代码中的一些问题:

  • 使用 输出到控制台后立即调用,这将清除已打印到控制台的所有内容System"cls";cout
  • 您可以将其全部更改为if cout << "m is " << m << endl;

现在回到你的问题。我必须解释很多,因为您想要完成的事情最好在多线程方法中完成,因为锁定当前线程以进行输入,并且您无法在当前线程上执行以在等待输入的同时持续显示输入。还有其他选择,但如果你想坚持下去,这是其中一种方法。getch()getch()getch()

让我们分步进行。首先,您需要两个单独的执行线程,一个用于打印代码中的当前输入值,另一个用于获取输入。为了实现这一点,我们需要一个 std::thread 对象来表示执行的第二个线程,因此我们将标头包含在我们的项目中:int mstd::thread

#include <thread>

现在我们需要一个函数来接受输入,这样我们就可以将其传递给我们的第二个线程并持续运行它。这最好使用匿名函数或所谓的 lambda 来实现

    auto func = [&m]() 
    {
        while (m != 'q')
        {
            m = _getch();
        }
    };

注意我们如何通过引用 () 捕获,以便我们可以在另一个线程上修改它。还要注意 while 的条件语句,这样我们就可以通过按下按钮来逃避循环。int m[&m]q

我进一步添加了输出速度,使输出速度降低,并允许您更好地查看输出值。完成循环后,我们通过调用其方法加入 。最后,我将 int 修改为确保最低限度的线程安全性。当你把它们放在一起时,你会得到这个:std::chrono::sleep_for()std::threadjoin()atomic

#include <atomic>
#include <chrono>
#include <conio.h>
#include <iostream>
#include <thread>

int main()
{
    std::atomic<int> m = 3;

    auto func = [&m]() {
        while (m.load() != 'q')
        {
            m.store(_getch());
        }
    };

    std::thread thread(func);

    while (m.load() != 'q') {
        std::cout << "m is " << m.load() << std::endl;
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }

    thread.join();

    return 0;
}

如果你想更深入地研究,我强烈建议你阅读多线程和并发。另一个技巧是不要在全局范围内使用,因为在较大的项目中,它可能会导致名称解析问题,而是尽可能习惯于键入命名空间,例如使用 而不是 .using namespace X;std::coutcout

评论

0赞 Sebitas1212 3/22/2023
非常感谢,这完全回答了我的问题,甚至给了我更多的东西来查找。我正在尝试制作一个简单的贪吃蛇游戏,而无需查看那里的数百万个视频之一,因此这有助于我使用箭头键并为蛇指明方向。