我正在修复用C ++编写的MFC应用程序。它是一个GUI,它通过USB与连接到PC的外部模块通信。
我想避免使用单独的线程。有没有办法可以将东西添加到主循环中,以便它连续运行而不是基于事件?
我希望mainloop在每个循环中调用函数runCommStack()。
答案 0 :(得分:1)
一些可能的方法:
CWnd::SetTimer
设置计时器。CWinApp::OnIdle
(由CWinApp::Run
调用)。CWinApp:Run
,复制和修改原始MFC的CWinApp:Run
。这绝对不是最简单的解决方案。这取决于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设备只需要很短的时间,这将起作用,否则在长时间读取期间将阻止用户界面。
但使用单独的线程绝对是一种更好的方法。