在Qt中,如何使用计时器来启用/禁用某个功能?

时间:2014-11-03 14:24:18

标签: c++ qt

假设我有一个函数work(),一旦调用它,我就不希望在接下来的5秒内调用它。 目前,我设计了一些简单的代码:

connect(timer,SIGNAL(timeout()),this,SLOT(resetflag()));
...
if(!flag)
{
    flag = true;
    work();
    timer.start();
}
...
void resetflag(){
  flag = flase;
}

我的问题是:1。)如何使这个线程安全?                 2.)有没有更简单优雅的方法呢?

1 个答案:

答案 0 :(得分:1)

保持上次调用函数的时间戳并在工作完成后更新它可能更简单:

//field
QElapsedTimer timeSinceLastCall;


//function
if(!timeSinceLastCall.isValid()||timeSinceLastCall.hasExpired(5*1000))
{
    timeSinceLastCall.restart();
    work();
}

但是该函数不是线程安全的(多个线程可以进入work()),您需要一些其他方法来排除它们,例如:

//field
QElapsedTimer timeSinceLastCall;
QMutex mutex;


//function
{
    QMutexLocker locker(&mutex);
    if(timeSinceLastCall.isValid() && !timeSinceLastCall.hasExpired(5*1000))
        return;
    timeSinceLastCall.restart();
}
work();