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

时间:2011-07-20 10:16:59

标签: c++ mfc

我的问题是正常的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字段中,处理程序(回调)函数?

2 个答案:

答案 0 :(得分:5)

您可以将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 called\n");
}

void SomeFunc()
{
    SetTimer(NULL, 1, 1000, timerCallback);

    MSG msg;

    // msg-pump
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

答案 1 :(得分:2)

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