TimerProc в c не работает? - PullRequest
       14

TimerProc в c не работает?

0 голосов
/ 16 августа 2011

Я пытаюсь написать обратный вызов для моего таймера. Я определил TimerProc следующим образом:

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
    //body of callback
}

и затем SetTimer определяется следующим образом:

myTimer = SetTimer(NULL,Timer_ID,30000,TimerProc);

Моя проблема в том, что обратный вызов никогда не вызывается после истечения времени (30 секунд).

спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

SetTimer работает путем отправки сообщения WM_TIMER в оконную процедуру по умолчанию. Следовательно, как говорится в MSDN:

Когда вы указываете функцию обратного вызова TimerProc, оконная процедура по умолчанию вызывает функцию обратного вызова, когда она обрабатывает WM_TIMER. Поэтому вам нужно отправлять сообщения в вызывающем потоке, даже если вы используете TimerProc вместо обработки WM_TIMER.

Поэтому убедитесь, что у вас работает Message Loop .

1 голос
/ 17 августа 2011

Код быстрого теста.У меня отлично работает.

#include <windows.h>

static const TCHAR gc_szClassName[]   = TEXT("Test");
static const TCHAR gc_szWindowTitle[] = TEXT("Test");

#define IDT_TIMER 0x100

VOID CALLBACK TimerProc(HWND hWnd, UINT uMessage, UINT_PTR uEventId, DWORD dwTime)
{
  // display a message box to see the results of our beautiful program
  MessageBox(hWnd, TEXT("This should pop up every 10 seconds.."), TEXT("Yay!"), MB_OK | MB_ICONINFORMATION);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
  switch (uMessage)
  {
    case WM_CREATE:
      // run every 10 seconds
      SetTimer(hWnd, IDT_TIMER, 10000, TimerPRoc);
      break;

    case WM_CLOSE:
      DestroyWindow(hWnd);
      break;

    case WM_DESTROY:
      KillTimer(hWnd, IDT_TIMER);
      PostQuitMessage(EXIT_SUCCESS);
      break;
  }

  return DefWindowProc(hWnd, uMessage, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCommandLine, int nShowCommand)
{
  // define variables
  HWND hWnd;
  WNDCLASS wc;
  MSG msg;

  // unused parameters
  UNREFERENCED_PARAMETER(hPrevInstance);
  UNREFERENCED_PARAMETER(lpszCommandLine);
  UNREFERENCED_PARAMETER(nShowCommand);

  // initialize WNDCLASS structure
  ZeroMemory(&wc, sizeof(wc));
  wc.lpfnWndProc = WndProc;
  wc.hInstance = hInstance;
  wc.lpszClassName = gc_szClassName;

  // attempt to register the class
  if (RegisterClass(&wc) != 0)
  {
    // attempt to create the window
    hWnd = CreateWindow(gc_szClassName, gc_szWindowTitle, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hInstance, NULL);
    if (hWnd != NULL)
    {
      // retrieve messages
      while (GetMessage(&msg, NULL, 0, 0) > 0)
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }

      // use the return-code from the window
      return (int)msg.wParam;
    }
  }
  return EXIT_FAILURE;  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...