2017-04-23 101 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功能。