C++ 在Qt中,如何使用计时器启用/禁用功能?
假设我有一个函数work(),一旦调用它,我不希望在接下来的5秒内调用它。 目前,我设计了一些简单的代码,如: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.)有什么更简单、更
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吗?如果发布的代码是唯一一个使用标志的代码,那么它应该足以使其成为线程安全的。