Manujaya Premathilaka Ответов: 1

Как установить время срабатывания для нескольких функций


I am a beginner in C++. Let's say I have 4 functions (func1(), func2(), func3() & func4()). And let's say I have assigned time values to be triggered for each function as below,
 
func1() - after each 3 seconds
func2() - after each 6 seconds
func3() - after each 9 seconds
func4() - after each 12 seconds

Eg:
    * After 3 seconds from the starting time of the program - func1()
    * After 6 seconds from the starting time of the program - func1(), func2()
    * After 9 seconds from the starting time of the program - func1(), func3()
    * After 12 seconds from the starting time of the program - func1(), func2(), func4()


How can I do this? A massive thank for helping me!


Что я уже пробовал:

Я попробовал использовать high_resolution_clock

ZurdoDev

Есть масса примеров, Если вы загуглите таймер c++.

CPallini

Действительно.

Rick York

Точный ответ зависит от разработки и рабочей среды вашей программы. Вы используете W32, QT, Wx, CLI, ...? Список можно продолжать.

1 Ответов

Рейтинг:
2

k5054

Самым простым способом было бы что-то вроде этого

#include <chrono>
#include <thread>

int main()
{
   // some processing ....
   
   size_t seconds = 0;
   while(seconds < 60)
   {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        seconds += 1;
        if( seconds % 3 == 0 )
             func1();
        if( seconds % 6 == 0 )
             func 2();
        // etc
    }

    // more processing
}


Проблема с этим подходом заключается в том, что ваш main() цикл останавливает всю работу на 1 секунду, так что если есть и другие вещи, которые вы хотите сделать, то вы блокируетесь до тех пор, пока sleep_for не завершится.

Если вы попытаетесь сделать это в цикле и измерить длительность, у вас возникнет пара проблем. Во-первых, у вас почти никогда не будет точного количества секунд, поэтому вам придется найти способ убедиться, что вы запускаете только один раз за интервал, а во-вторых, если у вас нет другой обработки, которая должна быть выполнена, то вы тратите много процессорного времени на выполнение "цикла ожидания", что приведет к снижению производительности вашей системы и, вероятно, является тем, чего вы хотите избежать.

Другим, более продвинутым решением было бы поместить каждую функцию в свой собственный поток с их собственным циклом синхронизации. Однако это сложно: поскольку каждый поток запускает свое собственное событие, порядок выполнения будет неопределенным, что может быть проблемой, а может и не быть. У вас также будет проблема с любыми общими ресурсами (например, файлами, экранным вводом-выводом, блоками данных), которыми нужно будет управлять так, чтобы любые изменения вносились разумным образом. Вам также нужно будет иметь возможность сигнализировать своим дочерним потокам о завершении работы и очистке, когда основной поток заканчивается.