如何在 2 次调用中执行 1 个基本方法?

问题描述 投票:0回答:1

我有 Anylogic 项目(但我在 Java 中也有同样的问题)。我有 2 个类实现,因此有两个代码位置(事件),我必须调用一些基本方法。这个基本方法应该在每次事件调用之后执行。问题是对于同一时刻任意数量的事件调用,我只需要执行基本方法 1 次。 例如。我有 2 个类,名为 Enter。每个 Enter 类都有一个事件“OnEnterSpeedChange”。这 2 个 Enter 类附加到一个名为 AllEnter 的主类。 AllEnter 有一个自己的事件“OnEnterSpeedChange”,每次至少有一个 Enter 执行事件“OnEnterSpeedChange”时调用。但是,如果 OnEnterSpeedChange 事件同时在 First Enter 类和 Second Enter 类调用,那么它的每个方法都会调用基方法,并且基方法也会调用两次。而且我只需要做一次! 我该如何解决?

解释。 我有一个代理(Agent1),阀元件位于其上。我将此代理放置在另一个代理 2 中(实质上是将其拖动到另一个代理的工作区)。将 Agent 1 拖动到 Agent 2 后,我创建了 Agent 1 的群体。agent1 群体的每个元素都有一个内部事件(通过 Valve 发出)OnSpeedChange。我对Agent2有一个相应的方法:每次agent1群体中任何元素的速度发生变化时,都必须在Agent2上执行方法。但是,如果在同一模型时间,agent1 发生了超过 1 次速度变化(例如,在模拟开始时,速度最初 = 0,然后变得大于 0),则应该为 agent2 调用类似的方法只有1次。

java anylogic
1个回答
0
投票

这听起来像是一个糟糕的架构决策,但这里有一种方法可以解决您的问题:

  1. triggered
    (父代理)中有一个布尔变量
    Agent2
    ,最初设置为
    false
  2. Agent1
    Agent2
    的事件中,首先检查是否为
    triggered==true
    。如果是这样,请不要执行该代码。如果没有,请触发代码并设置
    triggered=true
  3. 使用代码创建动态事件
    DE_Reset
    triggered=false
  4. Agent1
    Agent2
    的事件中,在步骤 2 进行检查后,调用
    create_DE_Reset(0);
    标记下一个时间步长。

同样,您可以通过另一个变量存储最后一次更改的时间并进行检查。

但再次强调:这些都是拐杖。您可能需要重新思考整体架构以获得更优雅的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.