gpt4 book ai didi

c++ - 模型、 View 、 Controller ——我理解类图,但我不理解所有的线程问题。建议?

转载 作者:行者123 更新时间:2023-11-30 02:11:05 25 4
gpt4 key购买 nike

我最近阅读了 Head First Design Patterns这本书,我特别喜欢关于 MVC 的章节似乎将前几章的所有内容结合在一起。然而,我现在正处于实现 MVC 模式(在 C++ 中使用 wxWidgets)的边缘,我开始意识到我对线程问题的了解不够多。

我有一个 View 必须随着模型的变化而不断更新,但是,用户可以与控件交互并影响模型。由于 View /控件和模型将在 2 个不同的线程中运行(或者是 3 个?),我如何确保我没有两个线程写入同一个数据对象?我是否负责为共享数据设置锁?还是只要我正确使用事件框架,我就可以以某种方式保证不会有任何问题?

最佳答案

MVC 最初是为基于消息的系统 (Smalltalk) 而设计的,在某种意义上与多线程相反。

我知道如何结合 MVC 和多线程的最佳(理论)方式是事件对象(或参与者)概念:对象存在于自己的线程中,可以向其他事件对象发送/接收消息/事件。这假设对象上的所有操作都是同步的 - 因为单个对象绑定(bind)到单个线程 - 类似于每个对象的互斥体。

I have a View that must be updated continuously as the Model changes, however, a user can interact with the Control and also affect the Model. Since the View/Control and the Model will be running in 2 different threads (or is it 3?),

我没有使用 wxWidgets 的经验,但应用程序的 GUI 部分通常是单线程的 (apparently valid for wxWidgets too),仅在主线程中运行。

View 和 Controller 是 UI 绑定(bind)的,因此必须在主线程中运行。为模型增加了额外的线程,使其成为 2。

how do I ensure that I don't have two threads writing to the same data object?

每个对象的互斥体。

Am I responsible for setting up locks on the shared data?

是的。

Or am I just somehow guaranteed to not have any problems as long as I use the events framework properly?

没有。如上所述,GUI 是单线程的。如果您启动自己的线程,则必须注意同步。

如果您从主/GUI 线程触发其他线程中的操作,那么显然您需要同步对共享数据的访问。如果其他线程想要访问 GUI,那么您必须使用特殊函数(在链接文章中提到)在主 GUI 线程中触发事件(例如,模型在后台线程中更新,View 必须在主线程中重绘)。

如果后台线程不断更新模型,那么显然必须特别注意线程不会一直保持互斥锁锁定,以便运行 View 的主线程 GUI 也可以访问模型。 (某种 readers-writer lock 是可取的。)必须禁用 Controller ,因为如果应用程序在后台执行某些操作,则可能不需要用户交互。

总的来说,我认为将 MVC 保留在主线程中会更好。 GUI 线程不会产生太多 CPU 负载,通常空闲事件 (wx has them too) 足以模拟后台作业。

关于c++ - 模型、 View 、 Controller ——我理解类图,但我不理解所有的线程问题。建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3915904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com