提问人:Sebitas1212 提问时间:3/20/2023 最后编辑:Jason AllerSebitas1212 更新时间:3/20/2023 访问量:122
如果用户没有输入任何内容,如何让程序做某事
How to make a program do something if the user doesn't input anything
问:
我有一个更大的项目,但我需要这个小东西的答案来添加到项目中。
这是我的示例代码:
#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 上。
答:
首先,我想指出你的代码中的一些问题:
- 使用 输出到控制台后立即调用,这将清除已打印到控制台的所有内容
System"cls";
cout
- 您可以将其全部更改为
if
cout << "m is " << m << endl;
现在回到你的问题。我必须解释很多,因为您想要完成的事情最好在多线程方法中完成,因为锁定当前线程以进行输入,并且您无法在当前线程上执行以在等待输入的同时持续显示输入。还有其他选择,但如果你想坚持下去,这是其中一种方法。getch()
getch()
getch()
让我们分步进行。首先,您需要两个单独的执行线程,一个用于打印代码中的当前输入值,另一个用于获取输入。为了实现这一点,我们需要一个 std
::thread 对象来表示执行的第二个线程,因此我们将标头包含在我们的项目中:int m
std::thread
#include <thread>
现在我们需要一个函数来接受输入,这样我们就可以将其传递给我们的第二个线程并持续运行它。这最好使用匿名函数或所谓的 lambda 来实现
auto func = [&m]()
{
while (m != 'q')
{
m = _getch();
}
};
注意我们如何通过引用 () 捕获,以便我们可以在另一个线程上修改它。还要注意 while 的条件语句,这样我们就可以通过按下按钮来逃避循环。int m
[&m]
q
我进一步添加了输出速度,使输出速度降低,并允许您更好地查看输出值。完成循环后,我们通过调用其方法加入 。最后,我将 int 修改为确保最低限度的线程安全性。当你把它们放在一起时,你会得到这个:std::chrono::sleep_for()
std::thread
join()
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::cout
cout
评论