我需要通知一些对象在新的一天开始清除它们的缓存。所以,我可以创建QTimer或类似的东西,并检查现在午夜+ 5ms与否的每一个ms,但对我来说这不是一个好主意。 是否(在QT中)有任何标准机制可以在不分配任何新对象的情况下获得有关此事件的通知?自应用程序初始化(如qApp)以来的静态或生活? 在这种情况下,你需要在00:00做什么,你会做什么?
UPD: 我正在寻找足够快的解决方案。快速意味着我需要尽可能快地清空插槽中的容器,因为容器中的午夜数据变得无效。因此,有一些其他计时器每隔100毫秒拍摄一次,它试图从容器中获取数据。我需要在任何可能的访问尝试之前清除容器中包含无效数据。
答案 0 :(得分:10)
最简单的解决方案确实利用了计时器。轮询时间的流逝不仅不必要,而且会在表现方面表现糟糕。只需在午夜罢工时开始行动:
static int msecsTo(const QTime & at) {
const int msecsPerDay = 24 * 60 * 60 * 1000;
int msecs = QTime::currentTime().msecsTo(at);
if (msecs < 0) msecs += msecsPerDay;
return msecs;
}
// C++11
void runAt(const std::function<void> & job, const QTime & at, Qt::TimerType type = Qt::VeryCoarseTimer) {
// Timer ownership prevents timer leak when the thread terminates.
auto timer = new QTimer(QAbstractEventDispatcher::instance());
timer->start(msecsTo(at), type);
QObject::connect(timer, &QTimer::timeout, [=job, &timer]{
job();
timer->deleteLater();
});
}
runAt([&]{ object->member(); }, QTime(...));
// C++98
void scheduleSlotAt(QObject * obj, const char * member, const QTime & at, Qt::TimerType type = Qt::VeryCoarseTimer) {
QTimer::singleShot(msecsTo(at), type, obj, member);
}
class MyObject : public QObject {
Q_OBJECT
void scheduleCleanup() {
scheduleSlotAt(this, SLOT(atMidnight()), QTime(0, 0));
}
Q_SLOT void atMidnight() {
// do some work here
...
scheduleCleanup();
}
public:
MyObject(QObject * parent = 0) : QObject(parent) {
...
scheduleCleanup();
}
};
还有一些其他计时器每隔100毫秒拍摄一次,它试图从容器中获取数据。
由于这两个定时器都可能在同一个线程中运行,因此它们是串行执行的,并且无论“后来”是多少都无关紧要。它们不会同时运行。