Как вызвать несколько функций по истечении срока действия QTimer?

#c #qt #qtimer

Вопрос:

Я хочу иметь возможность вызывать несколько функций/ методов при тайм-ауте таймера, не создавая новый метод слота, который вызывает нужные методы (см. Код).

 int foo;
int bar;

// …

private slots:
    inline void foo_func() { /*…*/ }
    inline void bar_func() { /*…*/ }
    inline void combination_of_multiple_func()
    {
        foo_func();
        bar_func();
    }

// …


// somewhere in a method:
if (foo == bar)
{
    // Schedule … every foo or bar milliseconds
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(combination_of_multiple_func()));
    timer->start(foo);
}
else
{
    // Schedule … every foo milliseconds
    QTimer *fooTimer = new QTimer(this);
    connect(fooTimer, SIGNAL(timeout()), this, SLOT(foo_func()));
    fooTimer->start(foo);

    // Schedule … every bar milliseconds
    QTimer *barTimer = new QTimer(this);
    connect(barTimer, SIGNAL(timeout()), this, SLOT(bar_func()));
    barTimer->start(bar);
}
 

Есть ли лучшее решение?

Ответ №1:

Во-первых, вы должны использовать новый синтаксис сигналов и слотов Qt, если сможете.

Я могу придумать 2 способа решения этой проблемы:

Используйте лямбду

 if (foo == bar)
{
    // Schedule … every foo or bar milliseconds
    QTimer *timer = new QTimer(this);
    connect(timer, amp;QTimer::timeout, this, [] { foo_func(); bar_func(); } );
    timer->start(foo);
}
 

Игнорируй это

Просто делайте 2 таймера каждый раз. Накладных расходов, вероятно, недостаточно, чтобы о них действительно заботиться.

Ответ №2:

Мой подход состоял бы в том, чтобы установить столько соединений, сколько необходимо, например, вместо:

 connect(timer, SIGNAL(timeout()), this, SLOT(combination_of_multiple_func()));
 

подключите сигнал к обоим слотам:

 connect(timer, amp;QTimer::timeout, this, amp;WhateverThisIs::foo_func);
connect(timer, amp;QTimer::timeout, this, amp;WhateverThisIs::bar_func);