|
实现每天定时执行一次的完整解决方案,使用Windows API和ATL/WTL框架
该方案通过比较系统日期变更实现每日单次触发,包含完整的头文件和实现类。使用时需在循环中定期调用CheckDailyTrigger(),当日期变更且到达设定时间时返回TRUE
DailyTimer.h
- #pragma once
- #include <windows.h>
- #include <atlstr.h>
- class CDailyTimer {
- public:
- CDailyTimer(WORD targetHour, WORD targetMinute);
- BOOL CheckDailyTrigger();
- private:
- WORD m_targetHour;
- WORD m_targetMinute;
- SYSTEMTIME m_lastTriggerDate;
- };
复制代码 DailyTimer.cpp
- "DailyTimer.h"
- CDailyTimer::CDailyTimer(WORD targetHour, WORD targetMinute)
- : m_targetHour(targetHour), m_targetMinute(targetMinute) {
- GetLocalTime(&m_lastTriggerDate); // 初始化最后触发日期
- }
- BOOL CDailyTimer::CheckDailyTrigger() {
- SYSTEMTIME current;
- GetLocalTime(¤t);
- // 检查日期变更(跨天)
- if(current.wYear != m_lastTriggerDate.wYear ||
- current.wMonth != m_lastTriggerDate.wMonth ||
- current.wDay != m_lastTriggerDate.wDay) {
-
- // 检查是否到达目标时间
- if(current.wHour == m_targetHour &&
- current.wMinute == m_targetMinute) {
- GetLocalTime(&m_lastTriggerDate); // 更新最后触发时间
- return TRUE;
- }
- }
- return FALSE;
- }
复制代码 MainApp.cpp
- #include "DailyTimer.h"
- int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) {
- CDailyTimer dailyTimer(14, 30); // 每天14:30触发
-
- while(TRUE) {
- if(dailyTimer.CheckDailyTrigger()) {
- // 执行每日任务
- MessageBox(NULL, _T("每日任务已执行"), _T("提示"), MB_OK);
- }
- Sleep(60000); // 每分钟检查一次
- }
- return 0;
- }
复制代码
|
|