2

我正在尝试通过使用 C++ 中包含的异步代理库 (AAL) 来调用两个独立线程(另请参阅此处了解 AAL 描述http://msdn.microsoft.com/en-us/library/dd492627.aspx)。代理库通过让您通过基于数据流而不是控制流的异步通信模型连接隔离组件,提供了共享状态的替代方案。数据流是指一种编程模型,当所有需要的数据都可用时进行计算;控制流是指按预定顺序进行计算的编程模型。

因为我不想等待来自一个代理的任意数据,所以我想使用 Concurrency::send() 和 Concurrency::try_receive()。但是,我在实现 try_receive 方法时遇到了问题(可以在此处找到文档http://msdn.microsoft.com/de-de/library/dd470874.aspx)。

我目前的实现:

ISource<bool>& _source;    
Concurrency::try_receive(_source, &Received,ITarget<CPlant*>::filter_method())

将 CPant 作为我的数据发送回 _source-Message 来自的代理。Agent1 使用 CPlant 类发送一个简单的布尔值“true”和 Agent2(包括上面提到的代码)响应。这与 Concurrency::receive() 一起使用,但我不想阻止当前代理的进一步执行。

您是否知道为什么我会遇到编译错误,例如

1>c:\users\robert\tum\da\src\sim\anlagensim\anlagensim\main.cpp(57): error C2782: 'bool Concurrency::try_receive(Concurrency::ISource<_Type> &,_Type &,const ITarget<_Type>::filter_method &)' : template parameter '_Type' is ambiguous
1>          c:\program files\microsoft visual studio 10.0\vc\include\agents.h(16553) : see declaration of 'Concurrency::try_receive'
1>          could be 'int *'
1>          or       'bool'
1>c:\users\robert\tum\da\src\sim\anlagensim\anlagensim\main.cpp(57): error C2780: 'bool Concurrency::try_receive(Concurrency::ISource<_Type> &,_Type &)' : expects 2 arguments - 3 provided

?

在此先感谢您的帮助!

4

2 回答 2

3

我从来没有对这个库做过任何事情,但是看看你可能试图匹配的函数签名:

template <
   class _Type
>
bool try_receive(
   ISource<_Type> & _Src,
   _Type & _value,
   typename ITarget<_Type>::filter_method const& _Filter_proc
);

所有三个参数都try_receive期望相同_Type。查看您调用它的方式,您正在传递参数(因此期望在您传递ISource<bool>的参数的位置(因此期望成为)。因为,编译器变得困惑并且未能解决该函数并尝试使用该函数的其他重载,这就是您收到奇怪错误的原因。_Src_Typebool_Filter_procITarget<CPlant*>_TypeCPlant*bool != CPlant*

由于我没有使用该库,因此我无法告诉您应该传递什么,但我猜您可能应该使用ISource<CPlant*>(或_TypeasCPlant而不是CPlant*)。

请注意,第二个参数也是 type _Type,因此Received需要使用与其他参数相同的模板类型(从您的问题中不清楚该参数当前是什么类型)。

于 2012-07-16T08:37:27.973 回答
0

我通过使用 OpenMP 做了另一种方法,它可以非常轻松地很好地支持数据共享和线程管理。

#include <omp.h>
...

#pragma omp parallel shared(Simulation, cout) default(none) num_threads(3)
{
    #pragma omp sections nowait
    {
        #pragma omp section 
        {
        ...
        }

        #pragma omp section 
        {
        ...
        }

        #pragma omp section
        {
        ...
        }
    }
}

建议/openmp在使用 Visual C++ 时使用 switch。

于 2012-08-10T09:05:34.183 回答