计时器
2025-11-23 10:51:23
发布于:浙江
#include <iostream>
#include <thread>
#include <chrono>
#include <iomanip>
#include <limits>
#include <atomic>
int main() {
using namespace std::chrono;
std::cout << "选择模式:\n1) 倒计时\n2) 秒表 (按回车开始,再按回车停止)\n输入 1 或 2,然后回车: ";
int mode;
if (!(std::cin >> mode)) return 0;
if (mode == 1) {
std::cout << "输入倒计时秒数(正整数): ";
int totalSeconds;
if (!(std::cin >> totalSeconds) || totalSeconds < 0) return 0;
for (int remaining = totalSeconds; remaining >= 0; --remaining) {
int m = remaining / 60;
int s = remaining % 60;
std::cout << '\r' << std::setw(2) << std::setfill('0') << m << ":" << std::setw(2) << s << std::flush;
if (remaining > 0) std::this_thread::sleep_for(seconds(1));
}
std::cout << std::endl;
}
else if (mode == 2) {
// clear remaining newline
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "按回车开始秒表..." << std::endl;
std::cin.get(); // wait for enter to start
std::atomic<bool> stopFlag(false);
// start a thread that waits for Enter to stop
std::thread stopper([&stopFlag]() {
std::cin.get(); // wait for enter to stop
stopFlag.store(true);
});
auto startTime = steady_clock::now();
while (!stopFlag.load()) {
auto elapsed = duration_cast<seconds>(steady_clock::now() - startTime).count();
int m = static_cast<int>(elapsed / 60);
int s = static_cast<int>(elapsed % 60);
std::cout << '\r' << std::setw(2) << std::setfill('0') << m << ":" << std::setw(2) << s << std::flush;
std::this_thread::sleep_for(seconds(1));
}
// print final elapsed
auto elapsedFinal = duration_cast<seconds>(steady_clock::now() - startTime).count();
int m = static_cast<int>(elapsedFinal / 60);
int s = static_cast<int>(elapsedFinal % 60);
std::cout << '\r' << std::setw(2) << std::setfill('0') << m << ":" << std::setw(2) << s << std::endl;
stopper.join();
}
else {
std::cout << "未知模式。程序退出。" << std::endl;
}
return 0;
}
这里空空如也












有帮助,赞一个