【问题标题】:How to react to an event triggered by a specific date and time being reached如何对到达特定日期和时间触发的事件做出反应
【发布时间】:2013-01-12 03:37:23
【问题描述】:

我正在使用 Windows 7 中的 Visual Studio 在 C++ 中编写一个应用程序。该应用程序是一个单页 MFC 对话框应用程序。我想在到达某个时间和日期时弹出一个消息框。我正在使用日期选择器来获取将用作触发器的指定日期,并使用 CTime 对象来存储当前时间和预期时间。

不幸的是,我不知道从哪里开始寻找。是否有一个对象每分钟每分钟向窗口发送一次通知或消息?如果没有,有没有什么具体的方法可以让我完成这项工作,或者我可以从哪里开始寻找建议?

编辑:是否可以计算当前日期和未来日期之间的秒数并创建一个单独的倒计时线程(使用计时器)?

【问题讨论】:

  • 我目前正在研究相互关联的 WM_TIMECHANGE 和 OnTimeChange() 函数。测试了它们,但它们并没有按照您想象的方式工作。如,我已经为 WM_TIMECHANGE 发送的时间设置了断点,并且它永远不会被发送,即使时间改变了。编辑:原来它只在应用程序更改时间时发送。
  • WM_TIMECHANGE 在您更改系统时间时引发。它不适用于计时器。

标签: c++ visual-c++ mfc scheduled-tasks


【解决方案1】:

这是接收定时器事件所需实现的功能的粗略草图:

UINT_PTR timerId = NULL;

void OnTimerEvent(HWND, UINT, UINT_PTR id, DWORD)
{
    if (timerId == id)
    {
        // timer action...
    }
}

void StartTimer()
{
    // call OnTimerEvent after 1000 milliseconds
    timerId = SetTimer(NULL, NULL, 1000, &OnTimerEvent);
}

void StopTimer()
{
    KillTimer(NULL, timerId);
}

【讨论】:

    【解决方案2】:

    您可以按照@StackedCrooked 的建议使用SetTimer。但如果系统时间改变,这将不起作用。例如,假设当前时间是 12:30,而您将其设置为 12:35,那么您将设置的 SetTimer 将是 5 分钟。但是,如果系统时间更改为 12:32,则计时器将在 12:37 左右触发,而不是在 12:35!

    为此,您可能喜欢使用CreateWaitableTimer

    【讨论】:

    • 我想出了一个半工作解决方案。我设置了一个每秒响起的计时器。每一秒,我使用 OnTimer 函数检查当前时间与从用户那里得到的时间。如果它们匹配,那么我会弹出一个消息框。如果他们不这样做,我什么也不做。一旦我完成应用程序并完成它应该做的事情,语法就会出现。
    • 这是一个糟糕的解决方案,你在浪费“计时器”资源!
    • 请解释一下?如果可能,请提供替代方案。这是行之有效的方法,我已经继续前进,但如果有更好的方法,我会接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多