MFC - 添加函数调用mainloop?

时间:2013-08-14 08:07:07

标签: windows user-interface mfc

我正在修复用C ++编写的MFC应用程序。它是一个GUI,它通过USB与连接到PC的外部模块通信。

我想避免使用单独的线程。有没有办法可以将东西添加到主循环中,以便它连续运行而不是基于事件?

我希望mainloop在每个循环中调用函数runCommStack()。

3 个答案:

答案 0 :(得分:1)

一些可能的方法:

  1. 您可以使用CWnd::SetTimer设置计时器。
  2. 您可以覆盖CWinApp::OnIdle(由CWinApp::Run调用)。
  3. 您可以覆盖CWinApp:Run,复制和修改原始MFC的CWinApp:Run。这绝对不是最简单的解决方案。
  4. 您可以创建后台主题。
  5. 这取决于runCommStack()的要求。这个功能运行很长时间了吗?那你可能不想在GUI线程中运行它。 runCommStack是否需要每n毫秒调用一次?那么在它自己的线程中运行它也可能更好。在其他情况下,您可以使用计时器或OnIdle方法。

    关于解决方案1:Tim指出WM_TIMER消息是低优先级消息,并且在消息队列中有其他更高优先级的消息时不会传递给应用程序。另请参阅Determine priority of a window message

    使用解决方案2,您应该提醒只有在没有可用的窗口消息时才会调用OnIdle。所以这与解决方案1完全相同(实际上有点差)。

    另请注意,如果调用对话框runCommStack或显示消息框,则解决方案2和3可能会导致DoModal()未被调用。这是因为在MessageBox()期间,控件不会返回到CWinApp::Run()

    我实施解决方案1或4。

答案 1 :(得分:1)

当没有消息(如键,鼠标,重绘)到达主循环时,暂停程序,等待下一条消息。因此,添加对主循环的调用的想法将给你非常不稳定的操作。例如,最小化窗口将停止所有USB通信。

使用SetTimer并在WM_TIMER处理程序中调用runCommStack函数可能会更令人满意。

答案 2 :(得分:0)

您可以使用CWinApp::OnIdle进行空闲处理;如果读取USB设备只需要很短的时间,这将起作用,否则在长时间读取期间将阻止用户界面。

但使用单独的线程绝对是一种更好的方法。