2008-11-05 59 views
1

我正在阅读这个帖子/文章:https://stackoverflow.com/questions/262298/windows-c-ui-technology2008 MFC和线程?

我也想知道一个非.NET的UI框架。特别是 - 在.NET支持串行端口之前(我不能相信他们将.NET从.NET的第一个版本中解放出来),我不得不将MFC用于应用程序。我不是一个GUI开发人员,并且很快发现自己拉扯我的头发是因为MFC与我的应用程序中的其他线程发挥不佳能力的可怕性 - 例如,调用UI控件方法来更新数据或从其他线程执行其他操作。这些挑战中的大多数都已经处理完毕,但是应用程序代码与消息传递等过于复杂,仅仅是为了解决MFC的缺陷。

所以 - 我的问题是:“新的和改进的”mfc是否支持线程 - 也就是说,如果我从另一个线程调用某个GUI对象的gui对象,它会像旧的mfc一样崩溃/呕吐,还是可以播放在现实世界?

编辑

为了澄清 - 我了解在不同的线程的GUI改写(munging)的关注,但我希望的是,不是程序员创建自定义的消息,并从工作线程发送它们 - 即GUI框架将为我工作,我可以从其他线程调用对象方法。也许这太希望了 - 特别是如果线程还不是语言规范的一部分的话。

+1

而五年后,我刚才在这里问了一个相关的问题; http://stackoverflow.com/questions/17340285/can-i-have-multiple-gui-threads-in-mfc?noredirect=1#comment25159554_17340285没有可靠的答案,但一些有用的评论。 – 2013-06-27 11:47:18

回答

2

MFC的基本体系结构在新版本中并没有真正改变。如果您之前对线程支持不满意,那么可以肯定地说,您仍然不会。我同意DavidK所说 - 这是所有框架必须处理的固有问题。 MFC没有提供多线程帮助的主要原因几乎肯定是因为它最初是在1992年推出的16位Windows。此时Windows不支持多任务处理,并且实际上是单线程的。

4

这不是MFC的限制 - 它是Windows的设计。你不能从随机的其他线程开始向任意控件发送消息。 (有时候,你可以,但是你需要知道你在做什么。)在.NET世界中同样如此 - 一旦控件可见,你需要使用委托来更新它,以便更新动作发生在正确的线程上。更一般地说,我认为从经验来看,你几乎总是有更好的方式,只有一个线程在应用程序中处理GUI,并使其余线程完全工作。让多个线程与GUI交互导致疯狂尝试跟踪发生的事情。

编辑

简短的回答原来的问题是,我很害怕,“无”:有许多人对如何线程,MFC和Windows交互没有根本性的重新工作。在这一点上,微软并未优先考虑MFC,我不认为这会改变。

+0

我明白你的观点。 MFC应该在实现中包装它,并从其他线程调用的对象发送消息。我不明白这是什么问题 - 处理UI消息显然必须在一个线程中完成 - 但是应该允许从任何线程IMO发送事件。 – Tim 2008-11-05 19:51:21

+0

我不得不说,我必须通过与其他线程使用MFC的回转是令人震惊的。我怀疑它与.NET GUI框架相比更加干净,但也许我错了。 – Tim 2008-11-05 19:51:55

+0

我认为从多个主题发布消息通常会安全,但我同意这是一个坏主意。 – Aardvark 2008-11-05 20:13:17

1

你可以做的一件事是将自定义消息发布给自己,windows消息泵会将该消息处理并在主线程上处理它,这样所有代码都可以正常工作。显然,你需要设置自己以异步的方式使用Windows,但这是Windows窗口的整个设计。

您可以使用工作线程帮忙,但让GUI在主线程上工作。

你会发现大多数窗口工具包也是单线程的(因为那里往往只有一个用户使用它们:)),那些不是比他们的价值更复杂。

0

使用.NET gui和线程,主要应用程序代码在MFC dll中。

通过c#代理调用它