gpt4 book ai didi

c++ - Cin 不等待输入?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:44:34 25 4
gpt4 key购买 nike

对于我正在进行的项目,我需要程序能够接收用户的输入,但是当他们输入某些内容时,程序可以继续循环。

例如:
while (true)
{
if (userInput == true)
{
cin >> input
}
//DO SOMETHING
}

这意味着 //DO SOMETHING 将在每个循环中发生,而无需用户按 enter 键一百万次。

之前,我的解决方案是使用来自 conio.h 的 kbhit()getch() 创建我自己的输入,但这变得非常困惑,而且我不喜欢使用 conio .h 出于可移植性等原因。此外,它不需要专门使用 cin,因为它很可能无法使用它,因此任何不需要的好解决方案我用一个“不是很好”的库来做我自己的输入,将不胜感激。

最佳答案

为此可能值得研究多线程。我通常对建议它犹豫不决,因为多线程会带来许多最终难以调试的潜在问题,但在这种情况下,它们可以很容易地隔离开来。我设想的是这样的:

#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>

int main() {
std::atomic<bool> interrupted;
int x;
int i = 0;

do {
interrupted.store(false);

// create a new thread that does stuff in the background
std::thread th([&]() {
while(!interrupted) {
// do stuff. Just as an example:
std::cout << i << std::flush;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
});

std::cin >> x;

// when input is complete, interrupt thread and wait for it to finish
interrupted.store(true);
th.join();

// apply x, then loop to make new thread to do stuff
i = x;
} while(x != -1); // or some other exit condition
}

乍一看,这看起来有点浪费,因为它不断产生和丢弃线程,但从计算的角度来看,用户输入需要永恒,因此开销不应过高。更重要的是,它确实具有避免任何数据竞争建议的优势,因为主(输入)循环和后台线程之间的唯一通信方式是原子中断标志,并且 x 的应用> 共享数据发生在没有运行主循环的线程时。

关于c++ - Cin 不等待输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27582493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com