Model view controller 如何在MVC中处理长时间运行的模型计算?

Model view controller 如何在MVC中处理长时间运行的模型计算?,model-view-controller,Model View Controller,我正在编写一个准MVC风格的应用程序。它有一个GUI、一个控制器和一个后端,用于处理所有的计算、数据访问等。这是偶然发生的,我对MVC没有任何经验,但我想更彻底地理解它 因此,模型必须进行一些冗长的计算。在传统的MVC方法中如何处理这个问题?我的方法是在自己的线程中生成长计算(以便不阻塞GUI),并让控制器定期查询其当前状态,以便知道何时更新GUI 在另一种情况下,模型正在播放和录制一些音频。这属于模型吗?模型应该主动告诉控制器它在做什么,还是应该保持被动并定期被查询?在我看来,轮询应该始终是最

我正在编写一个准MVC风格的应用程序。它有一个GUI、一个控制器和一个后端,用于处理所有的计算、数据访问等。这是偶然发生的,我对MVC没有任何经验,但我想更彻底地理解它

因此,模型必须进行一些冗长的计算。在传统的MVC方法中如何处理这个问题?我的方法是在自己的线程中生成长计算(以便不阻塞GUI),并让控制器定期查询其当前状态,以便知道何时更新GUI


在另一种情况下,模型正在播放和录制一些音频。这属于模型吗?模型应该主动告诉控制器它在做什么,还是应该保持被动并定期被查询?

在我看来,轮询应该始终是最后的解决方案。为什么不让您的模型发出进度事件并订阅它们呢?

在我看来,轮询应该始终是最后的解决方案。为什么不让您的模型发出进度事件并订阅它们呢?

我想在这里应该做什么(移植到DSP?真的吗?我想您只是指长时间运行的过程)是您应该让模型成为数据和元数据。让一个线程成为一个长期运行的控制器,它会更新数据和元数据。您的gui线程是其他控制器,当需要构建视图时,它们将查看数据和元数据,并为视图对此进行争论。元数据可以是长时间运行的转换或进程的当前状态,也可以包括播放头和记录头的位置。

我想在这里应该做什么(移植到DSP?真的吗?我想你只是指长时间运行的进程)是,你应该让模型成为数据和元数据。让一个线程成为一个长期运行的控制器,它会更新数据和元数据。您的gui线程是其他控制器,当需要构建视图时,它们将查看数据和元数据,并为视图对此进行争论。元数据可以是长时间运行的转换或过程的当前状态,也可以包括播放头和记录头的位置。

如果您正在考虑纯推式MVC方法,则信息路线应该是:

C→ M→ 五

在每个组件之间,推送一条具有不同语义字段的消息;在GUI应用程序中,通常是这样的:

  • 捕获GUI事件并调用控制器拥有的回调
  • 控制器将GUI面向事件的语义转换为带有参数的模型命令
  • 执行Model命令,询问(a)
    update()
    或(b)
    update(data)
    的相关视图
  • 使用(a),视图必须轮询模型以获取信息。如果可以避免的话,我不建议这样做,因为这样会在视图和模型之间创建紧密耦合

    使用(b),视图的
    update()
    方法有一个
    data
    参数,该参数足以让视图执行更新

    我认为,最好的解决办法是:

    让您的模型根据控制器事件(或消息)实例化计算线程。然后让计算线程通知模型其进度。实际上,模型可能有兴趣根据计算线程的进度/状态进行一些处理

    当模型想要通知其视图时(这些视图可能不同,取决于计算的进度或其他状态依赖关系),让它通知感兴趣的视图您需要发送的任何模型信息

    如果您的视图需要执行一些GUI渲染,这取决于您的GUI工具包线程安全性,您可能需要在视图更新中使用延迟渲染方法


    在模型和视图之间有一条方便的通信总线。但是,您也可以执行直接调用(这将在模型和视图之间创建紧密耦合)。

    如果您正在考虑纯粹的面向推送的MVC方法,则信息路线应该是:

    C→ M→ 五

    在每个组件之间,推送一条具有不同语义字段的消息;在GUI应用程序中,通常是这样的:

  • 捕获GUI事件并调用控制器拥有的回调
  • 控制器将GUI面向事件的语义转换为带有参数的模型命令
  • 执行Model命令,询问(a)
    update()
    或(b)
    update(data)
    的相关视图
  • 使用(a),视图必须轮询模型以获取信息。如果可以避免的话,我不建议这样做,因为这样会在视图和模型之间创建紧密耦合

    使用(b),视图的
    update()
    方法有一个
    data
    参数,该参数足以让视图执行更新

    我认为,最好的解决办法是:

    让您的模型根据控制器事件(或消息)实例化计算线程。然后让计算线程通知模型其进度。实际上,模型可能有兴趣根据计算线程的进度/状态进行一些处理

    当模型想要通知其视图时(这些视图可能不同,取决于计算的进度或其他状态依赖关系),让它通知感兴趣的视图您需要发送的任何模型信息

    如果您的视图需要执行一些GUI渲染,这取决于您的GUI工具包线程安全性,您可能需要在视图更新中使用延迟渲染方法


    在模型和视图之间有一条方便的通信总线。但是,您也可以执行直接调用(这将在模型和视图之间创建紧密耦合)。

    如果您的业务逻辑需要很长时间来处理,您可以使用几种技术来实现您的目标: 您可以尝试使用任务