假设我有一个函数 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();
关于c++ - 在Qt中,如何使用定时器来启用/禁用一个功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26716154/