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

标签 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 字段中一样,处理程序(回调)函数?

最佳答案

您可以将 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);
    }
}

关于c++ - 如何在我的 mfc 应用程序的非对话框 .cpp 中使用 SetTimer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6760327/

相关文章:

c++ - std::uncaught_exception 和 Microsoft __uncaught_exception 之间的区别?

c++ - C++11 中的 async(launch::async) 是否会使线程池过时以避免昂贵的线程创建?

c++ - MFC 发送消息中的对象

c++ - 我怎样才能像 Microsoft 应用程序一样创建 TreeView

C++ 应用程序 : clear commandline arguments?

c++ - std::vector在push_back和insert(end(),x)之间不一致崩溃

c++ - PropertyData 值数组

c++ - 从后面插入和从前面和后面取出的最有效容器是什么?

visual-c++ - CDialog 和 CDialogEx 的区别

c++ - COleDataSource/COleDropTarget 取消拖放操作