Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
C++ 模型、视图、控制器-我理解类图,但我不理解所有线程问题。劝告_C++_Multithreading_User Interface_Thread Safety_Wxwidgets - Fatal编程技术网

C++ 模型、视图、控制器-我理解类图,但我不理解所有线程问题。劝告

C++ 模型、视图、控制器-我理解类图,但我不理解所有线程问题。劝告,c++,multithreading,user-interface,thread-safety,wxwidgets,C++,Multithreading,User Interface,Thread Safety,Wxwidgets,我最近读了这本书,我特别喜欢关于MVC的那一章似乎把前几章中的所有内容结合在一起。然而,我现在正处于使用C++中的WxWiDeWS实现MVC模式的边缘,我开始意识到我不太理解线程问题。 我有一个视图,它必须随着模型的变化而不断更新,但是,用户可以与控件交互,也可以影响模型。由于视图/控件和模型将在两个不同的线程中运行,或者是在3个线程中运行,如何确保没有两个线程写入同一个数据对象?我是否负责在共享数据上设置锁?或者,只要我正确地使用events框架,我就可以保证不会有任何问题?理论上,您可以在一

我最近读了这本书,我特别喜欢关于MVC的那一章似乎把前几章中的所有内容结合在一起。然而,我现在正处于使用C++中的WxWiDeWS实现MVC模式的边缘,我开始意识到我不太理解线程问题。
我有一个视图,它必须随着模型的变化而不断更新,但是,用户可以与控件交互,也可以影响模型。由于视图/控件和模型将在两个不同的线程中运行,或者是在3个线程中运行,如何确保没有两个线程写入同一个数据对象?我是否负责在共享数据上设置锁?或者,只要我正确地使用events框架,我就可以保证不会有任何问题?

理论上,您可以在一个线程中运行MVC,但一般来说,您应该在适当的位置拥有锁


在最简单的情况下,您可以为模型设置一个全局互斥体,每个线程在需要执行某些操作时都会选择该互斥体。如果您希望模型连续运行,但在控制器和视图想要执行某项操作时会被其中断,则单个互斥锁仍然可以工作,但您需要在循环中释放它的一个点。

理论上,您可以在一个线程中运行MVC,但通常是的,您希望在适当的位置具有锁


在最简单的情况下,您可以为模型设置一个全局互斥体,每个线程在需要执行某些操作时都会选择该互斥体。如果您希望模型连续运行,但在需要执行某项操作时会被控制器和视图中断,则单个互斥锁仍然可以工作,但您需要在循环中的某个点将其释放。

MVC最初是为基于消息的系统Smalltalk设计的,从某种意义上说,它与多线程相反

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

我有一个视图,它必须随着模型的变化而不断更新,但是,用户可以与控件交互,也可以影响模型。由于视图/控件和模型将在2个不同的线程中运行,还是在3个线程中运行

我没有使用wxWidgets的经验,但通常应用程序的GUI部分是单线程的,只在主线程中运行

视图和控制器是UI绑定的,因此必须在主线程中运行。有额外的线程的模型,使它2

如何确保没有两个线程写入同一个数据对象

每对象互斥

我是否负责在共享数据上设置锁

或者,只要我正确地使用事件框架,我就可以保证不会有任何问题

否。如上所述,GUI是单线程的。如果您启动自己的线程,那么您必须处理同步

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

如果后台线程正在不断更新模型,那么显然必须特别注意,线程不会一直锁定互斥锁,以便运行视图的主线程GUI也可以访问模型。某种程度上是可取的。必须禁用控制器,因为如果应用程序在后台执行某些操作,则用户交互可能是不需要的


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

MVC最初是为基于消息的系统Smalltalk设计的,从某种意义上说,它与多线程相反

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

我有一个视图,它必须随着模型的变化而不断更新,但是,用户可以与控件交互,也可以影响模型。由于视图/控件和模型将在2个不同的线程中运行,还是在3个线程中运行 我没有使用wxWidgets的经验,但通常应用程序的GUI部分是单线程的,只在主线程中运行

视图和控制器是UI绑定的,因此必须在主线程中运行。有额外的线程的模型,使它2

如何确保没有两个线程写入同一个数据对象

每对象互斥

我是否负责在共享数据上设置锁

或者,只要我正确地使用事件框架,我就可以保证不会有任何问题

否。如上所述,GUI是单线程的。如果您启动自己的线程,那么您必须处理同步

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

如果后台线程正在不断更新模型,那么显然必须特别注意,线程不会一直锁定互斥锁,以便运行视图的主线程GUI也可以访问模型。某种程度上是可取的。必须禁用控制器,因为如果应用程序在后台执行某些操作,则用户交互可能是不需要的

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