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

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

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

最佳答案

保留上次调用该函数的时间戳并在工作完成后对其进行更新可能更简单:

//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();

10-06 07:31