MFC:从另一个线程访问 GUI?

Posted

技术标签:

【中文标题】MFC:从另一个线程访问 GUI?【英文标题】:MFC: accessing GUI from another thread? 【发布时间】:2013-08-27 09:57:55 【问题描述】:

所以通常只有主线程才能访问 MFC 应用程序中的 GUI。

但是,这是法律还是建议?如果我通过关键部分确保只有一个线程访问 GUI 中的某个对象,那么可以吗?或者,如果 MAIN 线程访问 GUI 的一部分,而另一个线程访问 GUI 的一部分,这是否是个问题。即使这两个对象不相互影响?

我问的原因是,如果我可以从另一个线程访问 GUI,这大大简化了我对应用程序的重写。

【问题讨论】:

你能出示你的代码吗? 你想访问 GUI 或其他东西的控件?? 并不是 Windows 强加了这个法则,而是所有的 other 代码对非线程安全的窗口做一些事情。包括 MFC。加上你不知道的代码,比如钩子。从工作线程更新窗口会流泪。 【参考方案1】:

不要这样做。如果你这样做,你将生活在一个充满断言和奇怪行为的世界中。 GUI 通过在主线程上“泵送”的 Windows 消息系统工作。如果您开始在另一个线程中修改 UI,您将遇到您的操作导致其他 UI 消息的情况,这些消息可能由主线程处理,同时您仍在尝试访问另一个线程上的 UI。

如果不尝试处理这类事情,MFC 编程就已经够难了。而是使用 PostMessage 将 UI 相关的处理放到主线程上。

【讨论】:

【参考方案2】:

我曾经认为从 MFC 中的工作线程访问 GUI 几乎是被禁止的,这是灾难的根源。但是最近我了解到,如果您知道自己在做什么,这并不是那么严格的规则,您可以使用工作线程来访问 GUI。在Win32 Multithreaded Book 中,提供了一个完全绘制在工作线程中的“自动画控件”示例。

如果我没记错的话,作者和你说的差不多,如果你在正确的地方放置关键部分,你可以使访问 GUI 线程安全。 MFC 自己不这样做的原因是出于性能原因。

【讨论】:

以上是关于MFC:从另一个线程访问 GUI?的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个线程更新 GUI 上的文本框 [重复]

PyQt - 从另一个线程修改 GUI

如何从另一个线程更新 GUI?

如何从另一个线程更新 GUI?

如何从另一个线程更新 GUI?

避免多次调用 Invoke 以从另一个线程更新 GUI