2017-04-23 62 views
-3

我最近尝试过cpp,在我正在做的事情中,我试图让它的值为20的变量每秒减1,但我也需要机器等待来自用户的输入。我尝试使用for循环,但它们不会继续,直到输入放置或变量用完。我看着时钟,但他们似乎不符合我的需要,或者我误解了他们的目的。C++在后台运行计时器?

有什么建议吗?

+0

请澄清一下“还需要等待输入”这与可变倒计数如何配合? – bolov

+1

在后台运行通常需要线程。我对C的使用经验比C++多得多,但就我所知,C++中的线程与C相似,因为它通常依赖于系统库(例如,POSIX兼容机器上的“pthread.h”)。因此,您使用的操作系统将是制定解决方案的主要因素。所有这些说,请包括你已经尝试过的代码。 StackOverflow在这里可以帮助解决问题,但社区中的我们这些人并不只是为其他人编写代码。 – SpencerD

+0

我猜你想要一个Windows媒体计时器。对于那个和任何真正的计时器,你需要在winapi环境中进行开发。 (假设Windows)。 –

回答

0

正如在评论中已经提出的那样,线程化是实现这一点的一种方式。有一个很好的自包含示例here(我从下面的代码中借用)。

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

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

与此同时,while循环将运行以记录已经过多少时间,递减计数器,并在异步作业完成时返回。从你的问题中不清楚这是否是你想要的行为,但它给了你这个想法。它会打印减量变量的值,但用户可以输入文本,并且一旦用户按下输入,它就会打印出来。

#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; 
    } 
} 

P.S.为了让这个工作在我的编译器上,我必须使用g++ -pthread -std=c++14 file_name.cpp来编译它,以正确地链接线程库并允许使用C++ 14功能。