有没有办法在 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 中有一个视图线程?的主要内容,如果未能解决你的问题,请参考以下文章

向 mfc 视图发送请求/更新视图

是否有可能/有必要在单独的线程中调用 OnDraw [MFC]

有没有办法在单个对话框/视图中使用 libvlc 同步播放多个文件

没有文档/视图架构的 MFC

如何在 MFC 应用程序首次启动时禁用自动文档/视图创建

当多个警报视图出现在同一个视图控制器中时,有没有办法交错?