3

SetTimerAPI を使用して X 分ごとに関数を呼び出そうとしました。だから、私はこのテストコードを書いた

void f()
{
 printf("Hello");
}
int main() 
{
 SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f); 
}

Hello を毎分書き込む必要がありますが、機能しません。

4

3 に答える 3

19

あなたのプログラムにはいくつかの問題があります:

  1. Cプログラムは終了すると終了するmain()ため、タイマーが発生する時間はありません。
  2. WM_TIMERWin32 タイマーは、どのウィンドウにも関連付けられていない場合でも、関数コールバックを提供する場合でも、メッセージを介して実装されるため、メッセージ ポンプ (以下を参照) が機能している必要があります。

    TimerProc コールバック関数を指定すると、既定のウィンドウ プロシージャは、WM_TIMER を処理するときにコールバック関数を呼び出します。したがって、WM_TIMER を処理する代わりに TimerProc を使用する場合でも、呼び出しスレッドでメッセージをディスパッチする必要があります。

    ソース: MSDN: SetTimer 関数

  3. コールバック関数のプロトタイプが正しくありません。http://msdn.microsoft.com/en-us/library/windows/desktop/ms644907%28v=vs.85%29.aspxを参照してください。

    void CALLBACK f(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
    {
      printf("Hello");
    }
    
    int main() 
    {
      MSG msg;
    
      SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f);
      while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    
      return 0;
    }
    

(このサンプル プログラムは終了しないことに注意してください。代わりに、実際のプログラムには、 を送信して終了するための追加のロジックが必要ですWM_QUIT)。

于 2013-03-28T15:06:15.923 に答える