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.) 有没有更简单优雅的方法来做到这一点?

最佳答案

保留上次调用函数的时间戳并在工作完成时更新它可能更简单:

//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/

相关文章:

c++ - 为什么这个变量被设置为假?

c++ - qtableview 添加并显示任意到达的订购项目?

c++ - ctrl+鼠标滚轮缩放

c++ - 在 Visual Studio 上编译 qt 示例时出现链接错误

c++ - 在 Windows 上为现有的基于控制台的应用程序创建 QT 应用程序作为 GUI

c++ - Qt XmlQuery 子查询属性

c++ - vkCmdClearColorImage 无法清除布局为

c++ - 如何使用 FILE *fp 调用函数关闭文件

python - 如何在 PySide/PyQt 的屏幕中央制作一个小部件?

c++ - 如何有效地改变矩阵的连续部分?