我如何使用SetTimer在非对话框.cpp在我的mfc应用程序

How do I use SetTimer in non-dialog .cpp in my mfc app?

本文关键字:cpp 我的 mfc 应用程序 对话框 何使用 SetTimer      更新时间:2023-10-16

我的问题是正常的mfc SetTimer,如下所示

void CTimersDlg::OnButtonBegin()
{
    // create the timer
    SetTimer(m_nTimerID, uElapse, NULL);
}
void CTimersDlg::OnButtonStop()
{
    // destroy the timer
      KillTimer(m_nTimerID);
}
void CTimersDlg::OnTimer(UINT nIDEvent)  // called every uElapse milliseconds
{
    // do something, but quickly
    CDialog::OnTimer(nIDEvent);
}

但是如果我需要在非dialog.cpp中使用SetTimer,例如在我的sender.cpp中如何创建计时器?在SetTimer字段,处理程序(回调)函数?

您可以传递NULL作为窗口句柄,并在调用SetTimer时包含回调函数。这将允许您接收定时器通知,而无需将其与特定窗口关联。

如果计时器打算在单独的"工作"线程(没有窗口的线程)中使用,您仍然需要处理消息队列以接收计时器通知。如果你正在使用CWinThread对象创建一个线程,这已经在CWinThread::Run的默认实现中为你处理了。

如果你能更新你的问题,包括更多关于sender.cpp内容的信息,我可以提供一个更合适的例子。它使用普通的Windows API来创建计时器并处理所需的调度队列。

// Example only.
VOID CALLBACK timerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    printf("Timer calledn");
}
void SomeFunc()
{
    SetTimer(NULL, 1, 1000, timerCallback);
    MSG msg;
    // msg-pump
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

SetTimer与windows相关联,您需要windows句柄才能使用它。对于非窗口类,你应该考虑使用CreateWaitableTimer或TimerQueue