控制台程序中的计时器

时间:2011-07-20 16:20:39

标签: c++ winapi

我正在使用Windows API编写C ++代码。

如果我想在没有提供GUI的程序中使用SetTimer及其朋友,我知道我可以使用SetTimer(NULL, 1, 2000, Timerflow),而NULLhWnd }参数。

如何编写处理,启动和终止计时器的代码?

2 个答案:

答案 0 :(得分:5)

查看CreateWaitableTimer()SetWaitableTimer()WaitForSingleObject()。无需回调或消息处理。请参阅MSDN's example

答案 1 :(得分:3)

您可以直接使用Win32 API使用SetTimer()函数,而无需使用任何包装类(MFC等)。

请记住,Windows计时器使用GUI事件循环。如果您不使用GetMessage()PeekMessage()函数处理事件,则在计时器结束时不会收到通知。您还需要创建一个定时器将附加到的窗口(WM_TIMER消息将在该窗口的window procedure中报告。

查看GetMessage()的文档,了解如何编写事件循环。另请查看“Creating a Timer”,了解如何处理WM_TIMER消息。

编辑:要采取的步骤概述

  1. 编写窗口程序:请参阅下面的示例。
  2. 注册窗口类:定义窗口类并将窗口过程设置为上述函数。使用RegisterClass()功能注册结构。
  3. 创建一个窗口:使用CreateWindow()功能创建刚刚注册的类的窗口。
  4. 运行事件循环:使用GetMessage()函数处理邮件。该循环中的DispatchMessage()调用会将WM_TIMER个事件转发到您的窗口过程,您可以从那里处理该消息。
  5. 第1步,第2步和第3步应该是WinMain()功能的一部分。以下是关键步骤的概述(故意不完整,检查文档以了解如何处理错误和清理):

    LRESULT __stdcall MyWindowProcedure
      ( HWND window, UINT message, WPARAM wparam, LPARAM lparam )
    {
      if (message == WM_TIMER) {
        // timer elapsed.
      }
      return DefWindowProc(window, message, wparam, lparam);
    }
    
    int __stdcall WinMain ( HINSTANCE application, HINSTANCE, LPSTR, int )
    {
        ::WNDCLASS klass;
        // ...
        klass.lpfnWndProc = &MyWindowProcedure;
        RegisterClass(&klass);
        // ...
        HWND window = CreateWindow(klass.lpszClassName, ...);
        // ...
        const DWORD SECOND = 1000;
        const DWORD MINUTE = 60 * SECOND;
        UINT_PTR timer = SetTimer(window, 0, 2*MINUTE, 0);
        // ...
        MSG message;
        while (GetMessage(&message, window, 0, 0) > 0)
        {
           TranslateMessage(&message);
           DispatchMessage(&message);
        }
        // ...
    }