有没有办法在 MFC 中有一个视图线程?
Posted
技术标签:
【中文标题】有没有办法在 MFC 中有一个视图线程?【英文标题】:Is there any way to have a thread for a view in MFC? 【发布时间】:2012-02-14 21:41:28 【问题描述】:我知道 MFC 在这里不是一个受欢迎的主题,但无论如何我正在寻找有关该平台的建议。
我有一个多线程 MFC 应用程序,它也经常使用 onIdle,我们想向应用程序添加一个绘图功能,在我们的例子中是 PGL。当然,一旦加了,剧情忽悠主要是因为onIdle。
所以我正在考虑为情节视图设置一个线程。但不确定如何进行。我相信我需要为此设置 ui 线程,因为它应该会收到一些消息。如有任何建议,我将不胜感激。
【问题讨论】:
【参考方案1】:您可能在这里混淆了几件事:
为图形使用单独的线程可能是个好主意(很难从您的描述中看出),但很可能没有必要。除非您的 UI 因绘图功能而变得无响应或迟缓,否则不太可能有任何好处。
如果您的问题闪烁,这是一个完全不同的问题,通常最好通过双缓冲绘图来解决 - 将绘图绘制到内存设备上下文,然后在完成后复制该数据(或者最好只是更新的部分)到屏幕上。
【讨论】:
正如我所说,闪烁是由于 App 类中的 OnIdle 例程造成的。仍然认为视图绘图的线程是不必要的? 根据您在此处放置的内容并针对其他答案,我会说单独的线程是不必要的,并且会增加很多复杂性,而不必解决闪烁问题。实际上,导致闪烁的不是 UpdateAllViews,而是它正在更新的视图中的绘制代码导致闪烁。这是一个微妙的区别,但很重要。如果您对视图进行双重缓冲,那么无论您更新它们的频率如何,它们都不会闪烁。 +1 指出线程不是必需的。你是对的。【参考方案2】:从 onIdle 中取出所有内容。 onIdle = '停止处理 UI 消息'中的东西。里面有虫子吗?
【讨论】:
OnIdle 仅在一次 OnIdle 运行时间较长时停止消息处理。仅当消息队列为空时才会执行 OnIdle()。 感谢您的回答。我无法摆脱 OnIdle 的东西,因为这个实时应用程序在那里做了必要的事情。但是我发现在 OnIdle 中调用了 UpdateAllViews,这就是闪烁的原因。【参考方案3】:MTMDI 示例说明了一个 MFC 用户界面线程,其中用户 接口事件在与主线程不同的线程中处理 应用程序线程。此示例是修改后的版本 单线程MDI 示例。
【讨论】:
以上是关于有没有办法在 MFC 中有一个视图线程?的主要内容,如果未能解决你的问题,请参考以下文章
是否有可能/有必要在单独的线程中调用 OnDraw [MFC]