获取整分钟触发事件

如果您想要确保某个操作在每个新的分钟开始时尽可能准确地执行,最好的方法是使用一个定时器,并在每分钟的开始时重新校准它。这样可以减少累积误差,并确保操作在长时间运行后仍然同步。

以下是一个使用Qt的示例,它创建了一个QTimer,它会在每分钟的开始时调用一个函数,并在函数执行后重新计算下一次触发的时间。

#include <QTimer>
#include <QDateTime>
#include <QObject>

class MinuteTimer : public QObject {
    Q_OBJECT

public:
    MinuteTimer(QObject *parent = nullptr) : QObject(parent), timer(new QTimer(this)) {
        // 连接定时器的信号到槽函数
        connect(timer, &QTimer::timeout, this, &MinuteTimer::onNewMinute);
        // 启动定时器
        rescheduleTimer();
    }

private slots:
    void onNewMinute() {
        // 每分钟开始时执行的操作
        qDebug() << "A new minute has started!";

        // 重新计划下一次触发
        rescheduleTimer();
    }

private:
    QTimer *timer;

    void rescheduleTimer() {
        // 获取当前时间
        QTime currentTime = QTime::currentTime();
        // 计算到下一个整分需要等待的时间(毫秒)
        int millisecondsToWait = (60 - currentTime.second()) * 1000 - currentTime.msec();

        // 如果已经非常接近下一分钟(例如,100毫秒内),则等待整整一分钟
        if (millisecondsToWait < 100) {
            millisecondsToWait += 60000;
        }

        // 重新设置定时器
        timer->start(millisecondsToWait);
    }
};

// 在某个适当的地方(如主函数或某个类的构造函数中)创建MinuteTimer实例
// MinuteTimer *minuteTimer = new MinuteTimer(parent);
posted @ 2024-04-22 11:02  sgggr  阅读(15)  评论(0编辑  收藏  举报