#创作灵感#
当你在一个类中需要多个地方使用定时器,但是又不需要为每一个操作定义一个定时器变量。因为它们之间的行为是单一的。
例如:某个程序需要播放警告声音,同一时间只能播放一个警告声音。一共有10种警告声音,需要根据优先级来播放。每次播放间隔时间根据需求来调整。这个时候有什么好的办法呢?
在具体的需求实验中,经过不断调整,最终找到了一种共享定时器的方法。具体做法如下:
一、定义定时器:
class ShareTimer: public QObject {...
private:QTimer *m_playTimer;static QMetaObject::Connection m_connection;
};
二、使用定时器的地方:
QMetaObject::Connection ShareTimer::m_connection;void playAlarm1(const bool &isStop)
{if( isStop){m_playTimer->stop();if( m_connection ){disconnect(m_playTimer, &QTimer::timeout, this, nullptr);QObject::disconnect(m_connection); // 断开连接}// 连接 QTimer 的 timeout 信号到一个 lambda 函数if( m_connection ){DEBUG<<"connection already success.....";}else{// 设置定时器每1000毫秒(即1秒)触发一次m_playTimer->setInterval(1000);//[捕获列表](参数列表) -> 返回类型 { 函数体 }m_connection = QObject::connect(m_playTimer, &QTimer::timeout, this , [this]() {if( g_AudioCtrl )g_AudioCtrl->playWavFile("DirectAlarmPriority",DirectAlarmPriority::D_BSD );DEBUG<<" playWavFile...............D_BSD.............. "<<"\n";});// 启动定时器m_playTimer->start();}}else{m_playTimer->stop();if( g_AudioCtrl )g_AudioCtrl->stopWavPlayer("DirectAlarmPriority",DirectAlarmPriority::D_BSD );if( m_connection ){disconnect(m_playTimer, &QTimer::timeout, this, nullptr);QObject::disconnect(m_connection); // 断开连接}else{DEBUG<<"connection is disconnect.......";}m_is0x04PlayState = false;DEBUG<<" disconnect.............................connection = "<<m_connection;}}