#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);