Почему мой класс таймера не выполняется при последовательном запуске без задержки?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему мой класс таймера не выполняется при последовательном запуске без задержки?

Сообщение Anonymous »

У меня есть специальный класс Timer на C++, который использует std::async для запуска таймера в отдельном потоке. Проблема, с которой я столкнулся, заключается в том, что когда я последовательно и без задержки вызываю start() для одного и того же объекта Timer, таймер не срабатывает во второй раз. Однако если я добавлю небольшую задержку между двумя вызовами start(), все будет работать нормально.
Вот код, который я использую:

Код: Выделить всё

#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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему мой класс таймера не выполняется при последовательном запуске без задержки?
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Как очистить перезапуск PythonNet при последовательном запуске сценариев Python на C#?
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как очистить перезапуск PythonNet при последовательном запуске сценариев Python на C#?
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Колебания задержки таймера в Java – как улучшить?
    Anonymous » » в форуме JAVA
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Scipy-correlate: как изменить задержки точек данных на временные задержки?
    Anonymous » » в форуме Python
    0 Ответы
    157 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»