Таймеры в консольной программе - PullRequest
1 голос
/ 20 июля 2011

Я пишу код C ++, используя Windows API.

Если я хочу использовать SetTimer и его друзей в программе, которая не представляет графический интерфейс, я знаю, что могу использовать SetTimer(NULL, 1, 2000, Timerflow)NULL, являющимся аргументом hWnd.

Как мне написать код для обработки, запуска и уничтожения таймера?

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Посмотрите на CreateWaitableTimer(), SetWaitableTimer() и WaitForSingleObject(). Никаких обратных вызовов или обработки сообщений не требуется. См. Пример MSDN .

3 голосов
/ 20 июля 2011

Вы можете использовать функцию SetTimer() напрямую, используя Win32 API, и без использования каких-либо классов-оболочек (MFC и т. Д.).

Имейте в виду, что эти окнатаймеры работают с циклом событий GUI.Если вы не обрабатываете события с использованием функций GetMessage() или PeekMessage(), по истечении таймера вы не получите уведомление.Вам также необходимо создать окно, к которому будет привязан таймер (сообщение WM_TIMER будет сообщено в процедуре окна этого окна .

ПроверкаИзучите документацию для GetMessage(), чтобы узнать, как написать цикл обработки событий. Также взгляните на « Создание таймера », чтобы узнать, как обрабатывать * 1025.* сообщение.

Редактировать: Обзор необходимых шагов

  1. Создать процедуру окна : Пример приведен ниже.
  2. Зарегистрируйте класс окна : определите класс окна и установите для оконной процедуры указанную выше функцию. Используйте функцию RegisterClass() для регистрации структуры.
  3. Создание окна : Используйте функцию CreateWindow(), чтобы создать окно только что зарегистрированного класса.
  4. Запустите цикл обработки событий : Использоватьфункция GetMessage() для обработки сообщений. Вызов DispatchMessage() в этом цикле перенаправит события WM_TIMER на вашокно процедуры, и вы можете обработать сообщение оттуда.

Шаги 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);
    }
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...