我可以在控制台C++应用程序中使用SetTimer()API吗?

Jal*_*nA1 8 c++ windows console timer

我有一个控制台应用程序正在使用DLL文件,该文件使用一个SetTimer()调用来创建一个计时器并在其自身内部启动一个函数.电话如下:

SetTimer((HWND)NULL, 0, timer_num, (TIMERPROC)UnSyncMsgTimer)) == 0) 
Run Code Online (Sandbox Code Playgroud)

期待接收定时器消息,但这种情况永远不会发生.我假设因为我的是一个控制台应用程序而不是标准的Windows GUI应用程序(就像最初使用DLL文件的地方一样).这将阻止DLL文件功能的关键部分工作.

我的应用程序需要保留一个控制台应用程序,我无法更改DLL.

是否有工作要做到这一点?

Mar*_* Yu 9

您可以使用CreateTimerQueueTimer函数

HANDLE timer_handle_;
CreateTimerQueueTimer(&timer_handle_, NULL, TimerProc, user_object_ptr, 10, 0, WT_EXECUTEDEFAULT);
//callback
void TimerProc(PVOID lpParameter, BOOLEAN TimerOrWaitFired)
{
    user_object* mgr = (user_object*) lpParameter;
    mgr->do();
    DeleteTimerQueueTimer(NULL, timer_handle_, NULL);
    timer_handle_ = NULL;
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*eyn 5

看一下下面的示例,它展示了如何在控制台应用程序中使用 WM_TIMER 消息:

(归功于简单示例网站)

#define STRICT 1 
#include <windows.h>
#include <iostream.h>

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
  cout << "Time: " << dwTime << '\n';
  cout.flush();
}

int main(int argc, char *argv[], char *envp[]) {
      int Counter=0;
      MSG Msg;
      UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc);

      cout << "TimerId: " << TimerId << '\n';
      if (!TimerId)
        return 16;
      while (GetMessage(&Msg, NULL, 0, 0)) {
        ++Counter;
      if (Msg.message == WM_TIMER)
        cout << "Counter: " << Counter << "; timer message\n";
      else
        cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
      DispatchMessage(&Msg);
    }

    KillTimer(NULL, TimerId);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*had 5

使用SetTimerAPI 设置的计时器需要Windows消息处理功能才能主动运行,因为这是发送时间消息的位置.

如果你需要一个计时器线程,那么你可以注册一个Window类并创建一个默认的窗口消息泵(参见这篇文章的简短例子),但更简单的过程可能只是启动第二个线程来处理你的计时事件和发送通知.

  • 您不需要窗口类来创建消息泵.只是一个调用`Peek/GetMessage()`,`TranslateMessage()`和`DispatchMessage()`的简单循环. (2认同)