Реализация time line с помощью цикла или sleep на Linux

211
23 декабря 2018, 12:20

Необходимо реализовать класс time line, который будет отсчитывать время через заданный ему интервал. Как лучше это сделать?

1 вариант.

void TimeLine::StartInThread()
{
    while(!this->stopped)
    {
        std::this_thread::sleep_for(this->interval);
        this->timestamp++;
    }
}

2 вариант.

void TimeLine::StartInThread()
{
    while(!this->stopped)
    {
        if(this->cur_timestamp - this->save_timestamp > this->interval)
        {
            this->save_timestamp = this->cur_timestamp;
            this->timestamp++;
        }
    }
}

Гарантирует ли 1 вариант, что sleep будет на просыпаться вовремя, например, каждые 25 миллисекунд? Как я понимаю второй вариант будет затрачивать больше процессорного времени.

Answer 1

Если у вас не система реального времени (системы linux и windows таковыми не являются) то первый вариант всегда будет срабатывать чуть позже, а если нагрузка на систему большая то значительно позже. Да, второй вариант будет нехило грузить одно из ядер.

4 месяца назад я тоже сталкивался с подобной необходимостью. Решил вопрос используя аппаратные таймеры.

READ ALSO
Сглаживание графики в Qt

Сглаживание графики в Qt

Есть следующий минимально компилируемый пример:

155
Сортировка в с++

Сортировка в с++

Недавно начал програмировать на с++ и возник вопросНаписал программу которая показывает список учеников и их оценки

351
C++ глобальный enum [закрыт]

C++ глобальный enum [закрыт]

Как создать enum который будет доступен везде? Я вот например создал enum и с ним все нормально работает в классах где создаю а вот в класе наследнике...

202
Парсинг и изменение даты в кастомном формате

Парсинг и изменение даты в кастомном формате

Есть строка с датой и времнем в определенном формате

175