C++ 在Qt中,如何使用计时器启用/禁用功能?

C++ 在Qt中,如何使用计时器启用/禁用功能?,c++,qt,C++,Qt,假设我有一个函数work(),一旦调用它,我不希望在接下来的5秒内调用它。 目前,我设计了一些简单的代码,如: connect(timer,SIGNAL(timeout()),this,SLOT(resetflag())); ... if(!flag) { flag = true; work(); timer.start(); } ... void resetflag(){ flag = flase; } 我的问题是:1)如何使这个线程安全? 2.)有什么更简单、更

假设我有一个函数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();

resetFlag
标记为插槽,并通过信号调用它。它将是线程安全的。在我当前的实现中,它已经是一个插槽了,不是吗?我不知道。你没有提供SSCE。您没有说明计划如何在那里使用MoltThreading。@DmitrySazonov:假设它仅通过信号调用。您不能简单地将标志声明为volatile吗?如果发布的代码是唯一一个使用标志的代码,那么它应该足以使其成为线程安全的。