我最近嘗試過cpp,在我正在做的事情中,我試圖讓它的值爲20的變量每秒減1,但我也需要機器等待來自用戶的輸入。我嘗試使用for循環,但它們不會繼續,直到輸入放置或變量用完。我看着時鐘,但他們似乎不符合我的需要,或者我誤解了他們的目的。C++在後臺運行計時器?
有什麼建議嗎?
我最近嘗試過cpp,在我正在做的事情中,我試圖讓它的值爲20的變量每秒減1,但我也需要機器等待來自用戶的輸入。我嘗試使用for循環,但它們不會繼續,直到輸入放置或變量用完。我看着時鐘,但他們似乎不符合我的需要,或者我誤解了他們的目的。C++在後臺運行計時器?
有什麼建議嗎?
正如在評論中已經提出的那樣,線程化是實現這一點的一種方式。有一個很好的自包含示例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功能。
請澄清一下「還需要等待輸入」這與可變倒計數如何配合? – bolov
在後臺運行通常需要線程。我對C的使用經驗比C++多得多,但就我所知,C++中的線程與C相似,因爲它通常依賴於系統庫(例如,POSIX兼容機器上的「pthread.h」)。因此,您使用的操作系統將是制定解決方案的主要因素。所有這些說,請包括你已經嘗試過的代碼。 StackOverflow在這裏可以幫助解決問題,但社區中的我們這些人並不只是爲其他人編寫代碼。 – SpencerD
我猜你想要一個Windows媒體計時器。對於那個和任何真正的計時器,你需要在winapi環境中進行開發。 (假設Windows)。 –