Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 2008 MFC和线程?_Visual Studio 2008_Multithreading_Visual C++_Mfc - Fatal编程技术网

Visual studio 2008 2008 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是否支持线程?也就是说,如果我

我正在读这篇帖子:

我还想知道一个非.NETUI框架。具体地说,在.NET支持串行端口之前(我不敢相信他们在.NET的第一个版本中没有提到),我被迫在应用程序中使用MFC。我不是一名GUI开发人员,很快就发现自己的头发拉长了,因为MFC在我的应用程序中无法很好地处理其他线程,例如调用UI控制方法来更新数据或从其他线程执行其他操作。这些挑战中的大多数都得到了解决,但是应用程序代码对于消息传递等过于复杂,只是为了解决MFC的缺点

那么-我的问题是:“新的和改进的”mfc是否支持线程?也就是说,如果我从另一个线程为gui对象调用某个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中,应该允许从任何线程发送事件