Хронобиблиотека С++ 11 - Как выполнить метод через определенный интервал времени?

Я хочу правильно использовать библиотеку chrono, чтобы настроить мой класс для вызова метода через несколько миллисекунд.

#include <iostream>
#include <chrono>
#include <ctime>

Class House
{
private:
   //...
public:
   House() {};
   ~House() {};

   void method1() { std::cout << "method1 called" << std::endl; };
   void method2() { std::cout << "method2 called" << std::endl; };
   void method3() { std::cout << "method3 called" << std::endl; };
};

int main
{
   House h;

   //For the object 'h', I need to call method1() after 100ms
   // ???

   //For the object 'h', I need to call method2() after 200ms
   // ???

   //For the object 'h', I need to call method3() after 300ms
   // ???

   return 0;
}

Любые идеи, как это сделать?


person waas1919    schedule 13.07.2015    source источник
comment
Некоторое время назад я пример простого обработчика событий таймера. Может быть, это немного поможет?   -  person Some programmer dude    schedule 13.07.2015
comment
Chrono — это библиотека времени, а не планирования. Расписание сложно.   -  person Kerrek SB    schedule 13.07.2015
comment
Спасибо @JoachimPileborg :) Думаю, это поможет!   -  person waas1919    schedule 13.07.2015


Ответы (1)


Это отрывок из книги, которую я читаю/изучаю с тех пор, как начал изучать C++. (Я начал около 3 месяцев назад, но до этого я немного практиковал Java и Python.) Это объясняет, как делать то, что вы собираетесь делать, а также пример для демонстрации. Я мог бы объяснить это своими словами; однако я чувствую, что это бьет гвоздь по голове:

5.3.4.1 Ожидание событий

Иногда потоку необходимо дождаться какого-либо внешнего события, например завершения задачи другим потоком или истечения определенного количества времени. Самое простое «событие» — это просто течение времени. Рассмотреть возможность:

auto t0 = high_resolution_clock::now();
this_thread::sleep_for(milliseconds{20}); 
auto t1 = high_resolution_clock::now();
cout << duration_cast<nanoseconds>(t1 - t0).count() << " nanoseconds passed\n";

Обратите внимание, что мне даже не нужно было запускать поток; по умолчанию this_thread относится к единственному потоку (§ 42.2.6). Я использовал duration_cast, чтобы настроить единицы измерения часов на нужные мне наносекунды. См. § 5.4.1 и § 35.2, прежде чем пытаться со временем сделать что-то более сложное. Средства времени находятся в <chrono>.

Язык программирования C++, 4-е издание, Бьерн Страуструп

Я чувствую, что использование этого метода поможет выполнить то, что вы пытаетесь сделать: выполнять задачи одну за другой. Проверьте <chrono>. Я нашел этот ответ из-за книги, которую читал, это не моя работа, это из книги. Если вы собираетесь одновременно выполнять множество задач, вам нужно будет создать потоки, и если они будут совместно использовать ресурс, вам, вероятно, потребуются блокировки или просто используйте unique_lock / lock_guard. Я предпочитаю unique_lock.

person TimLayne    schedule 14.07.2015
comment
Это очень наивный и поэтому уязвимый подход. Поскольку образец кода, предоставленный OP, является однопоточным, этого достаточно (учитывая, что интервалы планирования достаточно велики, чтобы не страдать от точности таймера), но в многопоточном сценарии это было бы катастрофой. - person Rudolfs Bundulis; 14.07.2015
comment
Пример этого ответа можно просто завернуть в лямбду и отправить в std::async, и он будет работать нормально. Хотя в долгосрочной перспективе вы, возможно, захотите обернуть его в класс, который сделает это за вас. - person KABoissonneault; 14.07.2015
comment
@Rudolfs, как вы можете сказать, я все еще нуб, изучаю новые вещи и основы каждый день, но все еще нуб. Спасибо за вклад - person TimLayne; 14.07.2015
comment
@KABoissonneault Я также рассматривал возможность использования асинхронного примера, как вы думаете, мне следует отредактировать это и включить его туда? Я просто пытался показать ему метод, очень похожий на подход, который он собирался использовать. - person TimLayne; 14.07.2015