C++ C++;在后台运行计时器?

C++ C++;在后台运行计时器?,c++,pc,C++,Pc,我最近尝试了cpp,在我正在做的事情中,我试图使一个值为20的变量每秒减去1,但我还需要机器等待用户的输入。我尝试使用for循环,但在输入被放置或变量用完之前,它们不会继续。我看了看钟,但它们似乎不符合我的需要,或者我只是误解了它们的用途 有什么建议吗 正如评论中所建议的,线程是实现这一点的一种方法。有一个很好的自包含示例(我在下面的代码中借用了这个示例) 在下面的代码中,启动了一个异步函数。关于这些问题的详细情况。这将返回一个future对象,该对象将在作业完成后包含结果 在这种情况下,作业正

我最近尝试了cpp,在我正在做的事情中,我试图使一个值为20的变量每秒减去1,但我还需要机器等待用户的输入。我尝试使用for循环,但在输入被放置或变量用完之前,它们不会继续。我看了看钟,但它们似乎不符合我的需要,或者我只是误解了它们的用途


有什么建议吗

正如评论中所建议的,线程是实现这一点的一种方法。有一个很好的自包含示例(我在下面的代码中借用了这个示例)

在下面的代码中,启动了一个异步函数。关于这些问题的详细情况。这将返回一个
future
对象,该对象将在作业完成后包含结果

在这种情况下,作业正在收听
cin
(通常是终端输入),并在输入某些数据时(即按下enter键时)返回

同时,while循环将运行,它跟踪经过的时间,递减计数器,并且在异步作业完成时返回。你的问题不清楚这是否正是你想要的行为,但它给了你想法。它将打印出递减变量的值,但用户可以输入文本,一旦用户按enter键,它将打印出该值

#include <iostream>
#include <thread>
#include <future>
#include <time.h>

int main() {
    // Enable standard literals as 2s and ""s.
    using namespace std::literals;

    // Execute lambda asyncronously (waiting for user input)
    auto f = std::async(std::launch::async, [] {
        auto s = ""s;
        if (std::cin >> s) return s;
    });

    // Continue execution in main thread, run countdown and timer:
    int countdown = 20;
    int countdownPrev = 0;
    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
    std::chrono::steady_clock::time_point end;

    double elapsed;

    while((f.wait_for(5ms) != std::future_status::ready) && countdown >= 0) {
        end = std::chrono::steady_clock::now();
        elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
        countdown = 20 - (int) (elapsed/1000);

        if (countdown != countdownPrev) {
            std::cout << "Counter now: " << std::fixed << countdown << std::endl;
            countdownPrev = countdown;
        }
    }
    if (countdown == -1) {
        std::cout << "Countdown elapsed" << std::endl;
        return -1;
    } else {
        std::cout << "Input was: " << f.get() << std::endl;
        return 0;
    }
}
#包括
#包括
#包括
#包括
int main(){
//启用标准文字为2s和“s”。
使用名称空间std::literals;
//异步执行lambda(等待用户输入)
自动f=std::async(std::launch::async,[]{
自动s=”“s;
if(std::cin>>s)返回s;
});
//在主线程中继续执行,运行倒计时和计时器:
整数倒计时=20;
int countdownprov=0;
std::chrono::staddy_clock::time_point begin=std::chrono::staddy_clock::now();
标准::时钟::稳定时钟::时间点结束;
双倍过去;
while((f.wait_for(5ms)!=std::future_status::ready)&&countdown>=0){
end=std::chrono::stable_clock::now();
已用=标准::计时::持续时间(结束-开始).count();
倒计时=20-(整数)(已过/1000);
如果(倒计时!=倒计时上一个){

STD:请阐明“还需要等待输入”。它如何适应变量倒计时?在后台运行一般需要线程。我有更多的经验,C比C++,但据我所知,线程在C++中类似于C,在这个意义上,它通常依赖于系统库。(例如,兼容POSIX的机器上的
pthread.h
)。因此,您使用的操作系统将是制定解决方案的一个主要因素。所有这些,请包括您尝试过的代码。StackOverflow是来帮助解决问题的,但我们社区中的人不只是来为其他人编写代码。我猜您需要一个windows media计时器。为此,以及任何真正的定时器,你需要在WINAPI环境中开发。(假设Windows)。“SpencerD:”据我所知,C++中的线程与C通常是依赖于系统库的。很多年来都不是这样。我们已经有Boost.Thread超过十年了,从2011年起就有了一个完全标准化的多线程内存模型。您已经尝试了一些事情,请发布/详细说明您尝试了什么,以及为什么它不能满足您的需要。这将帮助其他人帮助您。