代码之家  ›  专栏  ›  技术社区  ›  bastibe

如何处理MVC中的长期模型计算?

  •  1
  • bastibe  · 技术社区  · 15 年前

    我正在编写一个准MVC风格的应用程序。它有一个图形用户界面、一个控制器和一个后端,用于处理所有计算、数据访问和其他事务。这是偶然发生的,我对MVC没有任何经验,但我想更深入地了解它。

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

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

    4 回复  |  直到 11 年前
        1
  •  1
  •   Ben Klein    12 年前

    如果您正在考虑纯推送导向的MVC方法,那么信息路由应该是:

    C___V

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

    1. 捕获GUI事件并调用控制器拥有的回调。
    2. 控制器将图形用户界面面向事件的语义转换为带参数的模型命令。
    3. 执行model命令,向(a)询问相关视图 update() 或(b) update(data) .

    使用(a),视图必须轮询模型以获取信息。如果可以避免的话,我不建议这样做,因为它会在视图和模型之间产生紧密耦合。

    使用(b),视图_ 更新() 方法有 data 参数,该参数足以使视图执行更新。

    在我看来,最好的解决办法是:

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

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

    如果您的视图需要进行一些GUI呈现,根据您的GUI工具箱线程安全性,您可能需要在视图更新中使用延迟呈现方法。

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

        2
  •  3
  •   spender    15 年前

    在我看来,投票应该是最后的解决办法。为什么您的模型不发出进度事件并订阅它们呢?

        3
  •  1
  •   dlamblin    15 年前

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

        4
  •  -1
  •   Rinat Galyautdinov    11 年前

    如果您的业务逻辑需要很长的处理时间,您可以使用多种技术来实现您的目标: 您可以尝试在操作中使用任务和异步。 或 您可以使用wcf duplex调用,该调用将在完成后返回异步结果。 或 你可以试着用信号器