在单独的线程中调用 MFC UI 类上的方法

Posted

技术标签:

【中文标题】在单独的线程中调用 MFC UI 类上的方法【英文标题】:Calling methods on an MFC UI class in a separate thread 【发布时间】:2020-03-31 17:20:22 【问题描述】:

我的 MFC 应用程序中有两个线程。其中一个处理所有 Wnd 的东西,另一个处理一些文件管理。从其他线程调用 UI 类的某些方法通常是个好主意吗?例如,更新 UI 字段向用户显示的一些值。或者这是一种不好的做法,我必须向 Windows 类发送消息?如果我们尝试在 UI 线程中使用锁,GUI 将经常冻结,这是不可接受的,除非它用于非常琐碎的工作。这里的最佳做法是什么?在处理 UI 时,我们应该只使用消息传递机制吗?

UI 上还有一些方法不涉及数据或变量。例如告诉一个窗口最大化。在这种情况下调用 UI 类中的公共方法是不是很糟糕?

[编辑] 我忘了告诉我发送消息的问题。您的参数始终是两个指针,并且不容易自定义。

【问题讨论】:

最佳实践可能是使用 SendMessage()。您可以使用自定义消息或任何您想要的。 是的,这就是我的猜测(有根据的猜测)。所以我这样做是为了我实现的功能。但是代码中仍然存在调用窗口类中的方法的情况。 根据我的经验,没有办法定义结构/类来携带所需的信息并在 SendMessage() 中使用指向该结构的指针。您需要一个指向每个自定义消息处理程序中正确结构的指针,并严格规定哪个部分负责释放结构所需的内存。 【参考方案1】:

首先,用户界面应该是轻量级和响应式的。为此,所有繁重的工作都应该由一个单独的线程处理,其中它可以使用SendMessage() 与主 mfc UI 线程进行通信。

诸如最大化窗口之类的命令具有相当小的开销,并且可以在 UI 线程本身中完成。例如,为了模拟较长的过程,UI 可以使用动画进度条。

将 UI 与程序引擎分离也会使您的代码更加模块化、可重用且意图更加清晰。

【讨论】:

最大化窗口是的。但我的问题是,调用 UI 类的方法是否有某种规则或最佳实践。最大化窗户是一个不好的例子。因为 t 可以简单地通过消息来完成。更好的方法是在 UI 类中调用方法,使其从其他地方读取一些数据。该方法具有例如 4 个不同的参数。如果您可以这样做而不是使用发送消息并将这些参数作为 lParam 和 wParam 发送,那么您可以使代码更清晰。 说如果你必须用大量数据填充 listctrl 并且你希望 UI 能够响应,那么从另一个线程填充数据 aync 是明智的。 SendMessage() 只是另一种方式,您还可以使用套接字、osc 等。想象一下,通过 osc 读取数据,每 250 毫秒为您的控件上的动态音频条设置动画;在这里你不会喜欢每 250 毫秒的 UI 线程都用于绘图,你需要以不同的方式处理。 现在的问题是在 MFC 中使用其他方式是否可以接受? UI 线程和工作线程必须异步通信。这可以简单地使用 SendMessage 来实现,其中消息将被推送到消息队列。或者,您可以在 mfc 控件中设置一个计时器,以非常安全地检查跨线程共享的原子变量的状态。但应避免从其他线程更新 MFC 控件。

以上是关于在单独的线程中调用 MFC UI 类上的方法的主要内容,如果未能解决你的问题,请参考以下文章

未调用 MFC 的 CWinThread::PostThreadMessage 处理程序

UWP - 我无法从 UI 线程编辑 Application 类上的字段

调用不切换回单独的线程

mfc线程里面调用的套接字库会不会随着线程结束而自动释放?

[转]MFC子线程中更新控件内容的两种办法

如何从工作线程中调用 UI 线程上的方法? [复制]