假设我有一个函数work(),一旦调用它,我就不希望在接下来的5秒内调用它。 目前,我设计了一些简单的代码:
connect(timer,SIGNAL(timeout()),this,SLOT(resetflag()));
...
if(!flag)
{
flag = true;
work();
timer.start();
}
...
void resetflag(){
flag = flase;
}
我的问题是:1。)如何使这个线程安全? 2.)有没有更简单优雅的方法呢?
答案 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();