Вот код, который я использую:
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
class Timer {
public:
Timer() : running(false), stopRequested(false), interval_(0), singleShot(false) {}
void start(std::chrono::milliseconds interval) {
stop();
wait_for_thread_finish();
{
std::lock_guard lock(mutex);
interval_ = static_cast(interval.count());
running = true;
stopRequested = false;
startTime = std::chrono::steady_clock::now();
}
timerFuture = std::async(std::launch::async, &Timer::run, this);
}
void stop() {
{
std::lock_guard lock(mutex);
stopRequested = true;
running = false;
}
cv.notify_all();
}
void wait_for_thread_finish() {
if (timerFuture.valid()) {
// Check thread status using wait_for
auto status = timerFuture.wait_for(std::chrono::milliseconds(0));
if (status == std::future_status::timeout) {
// Thread is still running, wait for it to finish
timerFuture.wait();
}
}
}
void run() {
try {
auto nextWakeUp = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval_);
while (true) {
{
std::unique_lock lock(mutex);
if (cv.wait_until(lock, nextWakeUp, [this] { return stopRequested.load(); }))
break;
if (!running.load()) break;
}
timeoutCallback();
if (singleShot.load()) {
std::lock_guard lock(mutex);
running = false;
break;
}
nextWakeUp = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval_);
}
{
std::lock_guard lock(mutex);
running = false; // Ensure running is set to false after the loop exits
}
}
catch (const std::exception& e) {
// Handle exceptions
std::cerr
Подробнее здесь: [url]https://stackoverflow.com/questions/79355643/why-is-my-timer-class-not-executing-when-started-consecutively-with-no-delay[/url]