Я недавно попробовал cpp, в том, что я делаю, я пытаюсь сделать так, чтобы переменная со значением 20 вычиталась из 1 каждую секунду, но мне также нужно, чтобы машина ждала ввода от Пользователь. Я попытался использовать циклы for, но они не будут продолжаться до тех пор, пока не будет введен ввод или пока не закончится переменная. Я посмотрел на часы, но они, кажется, не соответствуют моим потребностям, или, может быть, я просто неправильно понял их цель.
Какие-либо предложения?
Как уже было предложено в комментариях, многопоточность является одним из способов сделать это. Есть хороший автономный пример Вот (который я позаимствовал в коде ниже).
В приведенном ниже коде запускается асинхронная функция. Подробности по этим Вот. Это возвращает future
объект, который будет содержать результат после завершения задания.
В этом случае работа слушает cin
(обычно это ввод с терминала) и будет возвращаться при вводе некоторых данных (т. е. при нажатии клавиши ввода).
В то же время будет выполняться цикл 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;
}
}
Постскриптум чтобы заставить это работать на моем компиляторе, я должен скомпилировать его с g++ -pthread -std=c++14 file_name.cpp
правильно связать библиотеку потоков и разрешить использование функций c ++ 14.
Других решений пока нет …