2017-04-23 1 views
-3

나는 최근에 cpp를 시도해 보았는데, 나는 20의 값을 갖는 변수가 1 초마다 감 해지도록하려고 노력하고있다. 그러나 나는 또한 기계가 사용자로부터의 입력. for 루프를 사용하여 시도했지만 입력이 배치 될 때까지 또는 변수가 다 떨어질 때까지 진행하지 않습니다. 나는 시계를 보았다. 그러나 그들은 나의 필요에 맞지 않는 것처럼 보였다. 또는 나는 단지 그들의 목적을 오해했다.백그라운드에서 C++ 실행 타이머가 필요합니까?

제안 사항?

+0

"입력을 기다려야 할 필요가있는 것"을 분명히하십시오. 변수 카운트 다운에 어떻게 맞습니까? – bolov

+1

백그라운드에서 실행하려면 일반적으로 스레딩이 필요합니다. 필자는 C++보다 훨씬 많은 경험을하지만, C++의 스레딩은 시스템 라이브러리 (예 : POSIX 호환 컴퓨터의'pthread.h ')에 의존한다는 점에서 C와 유사합니다. 따라서 사용중인 운영 체제가 솔루션을 구성하는 주요 요인이됩니다. 모든 내용은 시도한 코드를 포함하십시오. StackOverflow는 문제를 해결하는 데 도움이되지만 여기에있는 커뮤니티의 사람들은 단지 다른 사람들을위한 코드를 작성하는 것이 아닙니다. – SpencerD

+0

Windows Media 타이머가 필요하다고 생각합니다. 이를 위해 그리고 실제 타이머로 winapi 환경에서 개발해야합니다. (가정 Windows). –

답변

0

주석에서 이미 제안했듯이 스레딩이이를 수행하는 한 가지 방법입니다. 좋은 자체 포함 예제 here (아래 코드에서 빌린 것)이 있습니다.

아래 코드에서 비동기 함수가 시작되었습니다. 이 내용에 대한 자세한 내용은 here입니다. 작업이 끝나면 결과를 포함하는 future 개체를 반환합니다.

이 경우 작업은 cin (일반적으로 터미널 입력)을 청취하고 일부 데이터가 입력 될 때 (즉, 입력이 눌러지면) 돌아옵니다.

한편 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; 
    } 
} 

P. 이 컴파일러에서 작동하도록하려면 g++ -pthread -std=c++14 file_name.cpp을 올바르게 컴파일하여 스레딩 라이브러리를 연결하고 C++ 14 기능을 사용할 수 있도록해야합니다.

관련 문제