Concurrency 用探员舀

Concurrency 用探员舀,concurrency,eiffel,agents,Concurrency,Eiffel,Agents,我正在尝试同时使用代理回调。不幸的是,无论我做什么,它似乎总是按顺序运行,而不是并行运行。如果没有代理,它就不会 主要类别及用途: 柜台类别: 预期产出: COUNTER: 1Hello! COUNTER: 2Hello! COUNTER: 1Hello! etc. 实际产量: COUNTER: 1Hello! COUNTER: 1Hello! COUNTER: 1Hello! COUNTER: 1Hello! COUNTER: 1Hello! COUNTER: 2Hello! COUNTER

我正在尝试同时使用代理回调。不幸的是,无论我做什么,它似乎总是按顺序运行,而不是并行运行。如果没有代理,它就不会

主要类别及用途:

柜台类别:

预期产出:

COUNTER: 1Hello!
COUNTER: 2Hello!
COUNTER: 1Hello!
etc.
实际产量:

COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!

要按预期运行,我必须更改什么?

代理对象保留对目标的引用,在您的示例中是对applicationon类型的根对象的引用,因此对print\u hello的所有调用都会同步。为了避免这种情况,调用代理的对象应该记录在计数器对象中,并从那里使用

这可以通过向类计数器添加属性操作并更新其创建过程来实现

make (i: INTEGER; delay: INTEGER; a: separate PROCEDURE)
    do
        id := i
        delay_time := delay
        action := a
    end
...
action: separate PROCEDURE
然后将使用以下代码代替p.call in COUNTER.run,该功能运行不再具有参数p:


现在p在进入功能运行时没有被锁定,因此回调可以由不同的处理器交替执行。

非常感谢。如果内部循环不仅仅是一个计数器,而是一个无限循环,我该如何告诉计数器停止/暂停?或者我只是想在达到最大计数之前停止它,当我在中使用setter和条件时,似乎setter永远不会被调用,因为对象永远停留在他的run方法中。不管怎样,我找到了方法。我必须将停止条件包装在一个单独的处理器中。提示:如果保留停止条件的单独处理器本身没有行为,即仅用于设置和获取条件,则可以使用语法create stop.make在被动单独区域中创建相应的单独对象停止。那么就不会为它创建额外的线程。
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 1Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
COUNTER: 2Hello!
make (i: INTEGER; delay: INTEGER; a: separate PROCEDURE)
    do
        id := i
        delay_time := delay
        action := a
    end
...
action: separate PROCEDURE
        separate action as p do
            p.call
        end