見ての通りです。
正時、正分、正秒 でイベントしましょうという話しです。
リナックスなので タイマーつかってみました。
#ifndef TIMESIGNALEMITTER_H
#define TIMESIGNALEMITTER_H
#include <QObject>
#include <thread>
#include <atomic>
#include <chrono>
class TimeSignalEmitter : public QObject {
Q_OBJECT
public:
TimeSignalEmitter();
~TimeSignalEmitter();
void start();
void stop();
signals:
void signalTime(int flag);
private:
std::thread timerThread;
std::atomic<bool> running;
void timerFunction();
int calculateFlag(const std::tm& currentTime);
bool m_FlgTimecheckEntry=false;
};
#endif // TIMESIGNALEMITTER_H
#include "timesignalemitter.h"
#include <ctime>
#include <QDebug>
TimeSignalEmitter::TimeSignalEmitter() : running(false)
{
start();
}
TimeSignalEmitter::~TimeSignalEmitter() {
stop();
}
void TimeSignalEmitter::start() {
running = true;
timerThread = std::thread(&TimeSignalEmitter::timerFunction, this);
}
void TimeSignalEmitter::stop() {
running = false;
if (timerThread.joinable()) {
timerThread.join();
}
}
void TimeSignalEmitter::timerFunction() {
while (running) {
auto now = std::chrono::system_clock::now();
auto now_c = std::chrono::system_clock::to_time_t(now);
std::tm now_tm = *std::localtime(&now_c);
int flag = calculateFlag(now_tm);
if (flag != 0) {
emit signalTime(flag);
}
// Sleep for 1ms to reduce CPU usage
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
int TimeSignalEmitter::calculateFlag(const std::tm& currentTime) {
int flag = 0;
if (currentTime.tm_sec == 50) m_FlgTimecheckEntry=true;
if (!((currentTime.tm_sec == 0) && m_FlgTimecheckEntry))return flag;
m_FlgTimecheckEntry=false;
// Check for each condition and set the appropriate flag
if (currentTime.tm_sec == 0) {
flag |= 1; // Every minute at 00 seconds
}
if (currentTime.tm_sec == 0 && currentTime.tm_min % 5 == 0) {
flag |= 2; // Every 5 minutes at 00 seconds
}
if (currentTime.tm_sec == 0 && currentTime.tm_min % 15 == 0) {
flag |= 4; // Every 15 minutes at 00 seconds
}
if (currentTime.tm_sec == 0 && currentTime.tm_min % 30 == 0) {
flag |= 8; // Every 30 minutes at 00 seconds
}
qDebug()<<__PRETTY_FUNCTION__<<flag<<currentTime.tm_hour<<":"<<currentTime.tm_min<<":"<<currentTime.tm_sec;
return flag;
}