Visual studio 2008 2008 MFC和线程?
我正在读这篇帖子: 我还想知道一个非.NETUI框架。具体地说,在.NET支持串行端口之前(我不敢相信他们在.NET的第一个版本中没有提到),我被迫在应用程序中使用MFC。我不是一名GUI开发人员,很快就发现自己的头发拉长了,因为MFC在我的应用程序中无法很好地处理其他线程,例如调用UI控制方法来更新数据或从其他线程执行其他操作。这些挑战中的大多数都得到了解决,但是应用程序代码对于消息传递等过于复杂,只是为了解决MFC的缺点 那么-我的问题是:“新的和改进的”mfc是否支持线程?也就是说,如果我从另一个线程为gui对象调用某个mfc控件,它会像旧的mfc一样崩溃/呕吐,还是可以在现实世界中播放 编辑Visual studio 2008 2008 MFC和线程?,visual-studio-2008,multithreading,visual-c++,mfc,Visual Studio 2008,Multithreading,Visual C++,Mfc,我正在读这篇帖子: 我还想知道一个非.NETUI框架。具体地说,在.NET支持串行端口之前(我不敢相信他们在.NET的第一个版本中没有提到),我被迫在应用程序中使用MFC。我不是一名GUI开发人员,很快就发现自己的头发拉长了,因为MFC在我的应用程序中无法很好地处理其他线程,例如调用UI控制方法来更新数据或从其他线程执行其他操作。这些挑战中的大多数都得到了解决,但是应用程序代码对于消息传递等过于复杂,只是为了解决MFC的缺点 那么-我的问题是:“新的和改进的”mfc是否支持线程?也就是说,如果我
为了澄清,我理解在不同线程中使用GUI的担忧,但我希望的是,与程序员创建自定义消息并从工作线程发送消息不同,GUI框架将为我完成所有工作,我可以从其他线程调用对象方法。也许这太令人失望了——特别是如果线程还不是语言规范的一部分的话。这不是MFC的限制——这是Windows的设计。您不能开始从其他随机线程向任意控件发送消息。(好吧,有时候你可以,但你需要知道你在做什么。)这在.NET世界中同样适用-一旦控件可见,你需要使用委托来更新它,以便更新操作在正确的线程上发生 更一般地说,根据经验,在应用程序中只使用一个线程处理GUI,并使其余线程成为纯工作线程,几乎总是更好的。让多个线程与GUI交互会导致疯狂地试图跟踪正在发生的事情 编辑
对于最初的问题,我恐怕简短的回答是“不”:没有对线程、MFC和Windows如何交互进行根本性的重新研究。在这一点上,由于MFC在微软几乎不被优先考虑,我不认为这会改变。这不是MFC的限制,而是Windows的设计。您不能开始从其他随机线程向任意控件发送消息。(好吧,有时候你可以,但你需要知道你在做什么。)这在.NET世界中同样适用-一旦控件可见,你需要使用委托来更新它,以便更新操作在正确的线程上发生 更一般地说,根据经验,在应用程序中只使用一个线程处理GUI,并使其余线程成为纯工作线程,几乎总是更好的。让多个线程与GUI交互会导致疯狂地试图跟踪正在发生的事情 编辑
对于最初的问题,我恐怕简短的回答是“不”:没有对线程、MFC和Windows如何交互进行根本性的重新研究。在这一点上,由于MFC在Microsoft很难被优先考虑,我不希望这种情况发生变化。您可以做的一件事是向自己发布自定义消息,windows消息泵将接收该消息并在主线程上处理,因此您的所有代码都可以正常工作。显然,您需要设置自己以异步方式使用windows,但这就是windows窗口的整个设计 您可以使用辅助线程来提供帮助,但要让GUI在主线程上工作
你会发现大多数窗口工具包也是单线程的(因为往往只有一个用户在使用它们:)),那些不太复杂的工具包比它们的价值更高。你可以做的一件事是向自己发布一条自定义消息,windows消息泵将接收该消息并在主线程上处理它,所以你所有的代码都可以正常工作。显然,您需要设置自己以异步方式使用windows,但这就是windows窗口的整个设计 您可以使用辅助线程来提供帮助,但要让GUI在主线程上工作
你会发现大多数窗口工具包都是单线程的(因为往往只有一个用户在使用它们:)。那些不太复杂的工具包比它们的价值更高。MFC的基本架构在新版本中没有真正改变。如果您对以前的线程支持不满意,那么可以肯定地说您仍然不满意。我同意DavidK所说的——这是所有框架都必须处理的固有问题。MFC没有为多线程提供太多帮助的主要原因几乎可以肯定,因为它最初是在1992年为16位Windows引入的。此时Windows不支持多任务,实际上是单线程的。新版本中MFC的基本架构没有真正改变。如果您对以前的线程支持不满意,那么可以肯定地说您仍然不满意。我同意DavidK所说的——这是所有框架都必须处理的固有问题。MFC没有为多线程提供太多帮助的主要原因几乎可以肯定,因为它最初是在1992年为16位Windows引入的。此时Windows不支持多任务,实际上是单线程的。使用.NET gui和线程,MFC dll中的主要应用程序代码
通过c#delegate调用它使用.NET gui和线程,MFC dll中的主要应用程序代码
通过c#delegate调用它我明白你的意思。MFC应该在实现中包装它,并从其他线程调用的对象发送消息。我不认为这是一个问题——处理UI消息显然必须在一个线程中完成——但在IMO中,应该允许从任何线程发送事件